linux streams

sort

Сортировка строк текстового файла или стандартного ввода

Описание

sort — стандартная утилита Unix для сортировки строк текста. По умолчанию сортирует в лексикографическом порядке (по алфавиту), но поддерживает числовую сортировку, сортировку по полям, обратный порядок, сортировку по размеру файлов (human-readable) и многое другое. Утилита существует с ранних версий Unix и стандартизирована в POSIX.

sort читает строки из файлов или stdin, сортирует их и выводит в stdout. По умолчанию сравнение лексикографическое — символ за символом согласно таблице ASCII/локали. Числовая сортировка (-n) сравнивает числовые значения, а не лексикографические: «10» будет после «9», а не перед «2».

Команда незаменима в связке с uniq (удаление дубликатов требует отсортированного ввода), при обработке CSV/TSV данных, при анализе логов. Флаг -k позволяет сортировать по конкретному полю, что делает sort мощным инструментом для работы с табличными данными.

Синтаксис

sort [OPTION]... [FILE]...
# Простая сортировка sort names.txt # Числовая сортировка sort -n numbers.txt # Обратный порядок sort -r file.txt # Сортировка по второму полю (разделитель ':') sort -t: -k2 /etc/passwd

Флаги и опции

Флаг Описание Пример
-n Числовая сортировка (по числовому значению, не лексикографически) sort -n sizes.txt
-r Обратный порядок сортировки sort -rn file.txt
-u Удалить дубликаты (unique) — оставить только уникальные строки sort -u list.txt
-k POS Сортировать по полю (ключу) с позиции POS; формат -k N,M sort -k2,2 data.txt
-t SEP Разделитель полей (по умолчанию — пробел/таб) sort -t: -k3 /etc/passwd
-h Human-readable числа (1K, 2M, 3G — как выводит du -h) du -h | sort -h
-V Сортировка версий (1.9 < 1.10 < 2.0) sort -V versions.txt
-f Игнорировать регистр (fold case) sort -f names.txt
-b Игнорировать ведущие пробелы sort -b file.txt
-o FILE Записать результат в файл (можно тот же файл, что на входе) sort -o file.txt file.txt
-c Проверить, отсортирован ли файл (без вывода) sort -c sorted.txt
-s Стабильная сортировка (stable) — сохраняет порядок равных строк sort -s -k1,1 data.txt

Паттерны использования

Топ-N самых больших файлов

du -sh * | sort -rh | head -10
ls -lS | head -10   # по размеру

Уникальные значения

# Уникальные IP из лога
cut -d' ' -f1 access.log | sort -u

# Сколько раз каждый IP
cut -d' ' -f1 access.log | sort | uniq -c | sort -rn

Сортировка CSV по полю

# Сортировка по 3-му полю (числово)
sort -t',' -k3,3n data.csv

# Сортировка по 2-му полю алфавитно
sort -t',' -k2,2 data.csv

Многоуровневая сортировка

# Сначала по полю 1, затем по полю 2 числово
sort -k1,1 -k2,2n employees.txt

# Обратно по числовому полю 3
sort -t: -k3,3rn /etc/passwd

Сортировка версий

ls *.tar.gz | sort -V
echo -e "1.10\n1.9\n2.0\n1.1" | sort -V
# Вывод: 1.1, 1.9, 1.10, 2.0

Проверка и сортировка на месте

# Проверить отсортирован ли файл
sort -c file.txt && echo "sorted"

# Отсортировать файл на месте
sort -o names.txt names.txt

Советы и предупреждения

Совет: Комбинация sort | uniq -c | sort -rn — классический способ подсчёта частоты вхождений: cat access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -10
Совет: Для сортировки вывода du -h обязательно используйте sort -h, а не sort -n — иначе «1G» окажется рядом с «1», а не в конце.
Совет: Флаг -k N,N (одинаковые числа) задаёт сортировку строго по одному полю N. -k N без второго числа сортирует от поля N до конца строки.
Внимание: Не используйте sort file.txt > file.txt — это уничтожит файл до того, как sort успеет его прочитать. Используйте sort -o file.txt file.txt или временный файл.
Внимание: Лексикографическая сортировка числовых данных даст неверный результат: «10» < «2» < «20» < «9». Всегда используйте -n для чисел.