sort
Сортировка строк текстового файла или стандартного ввода
Описание
sort — стандартная утилита Unix для сортировки строк текста. По умолчанию сортирует в лексикографическом порядке (по алфавиту), но поддерживает числовую сортировку, сортировку по полям, обратный порядок, сортировку по размеру файлов (human-readable) и многое другое. Утилита существует с ранних версий Unix и стандартизирована в POSIX.
sort читает строки из файлов или stdin, сортирует их и выводит в stdout. По умолчанию сравнение лексикографическое — символ за символом согласно таблице ASCII/локали. Числовая сортировка (-n) сравнивает числовые значения, а не лексикографические: «10» будет после «9», а не перед «2».
Команда незаменима в связке с uniq (удаление дубликатов требует отсортированного ввода), при обработке CSV/TSV данных, при анализе логов. Флаг -k позволяет сортировать по конкретному полю, что делает sort мощным инструментом для работы с табличными данными.
Синтаксис
- [OPTION] — флаги управления сортировкой
- [FILE] — файлы для сортировки; без файла читает stdin
- Можно передать несколько файлов — они объединяются перед сортировкой
- Результат выводится в stdout; для записи в файл используйте
-oили перенаправление
Флаги и опции
| Флаг | Описание | Пример |
|---|---|---|
-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 или временный файл.
-n для чисел.