Команда sort в Linux — полное руководство

Что такое команда sort
Команда sort упорядочивает строки входного текстового потока или файлов и выводит результат в стандартный вывод. Она поддерживает множество опций, которые меняют критерии и поведение сортировки: числовая, обратная, по столбцам, с игнорированием регистра, по месяцам, удаление дубликатов и другие. По умолчанию sort читает файлы или stdin и печатает отсортированный набор строк без изменения исходных файлов.
Короткое определение: sort — утилита для сортировки строк с множеством флагов для управления порядком.
Важно: поведение сортировки зависит от локали (LC_COLLATE). Для стабильного «байт-ориентированного» порядка используйте LC_ALL=C sort.
Простая синтаксическая справка
Базовый синтаксис:
sort filenameГде filename — путь к текстовому файлу или несколько файлов. Если имя файла не указано, sort читает из stdin.
По умолчанию sort упорядочивает строки следующим образом:
- Сначала сравнение выполняется согласно правилам локали.
- Числовые строки не имеют приоритета по умолчанию (чтобы сортировать как числа, используйте -n).
- По умолчанию регистр влияет: строки с маленькими буквами могут идти перед строками с теми же буквами в верхнем регистре, в зависимости от локали.
Пример: файл textfile.txt
Сортировка по умолчанию:
sort textfile.txtВывод:
Создать новый файл с результатом сортировки
sort сам по себе не изменяет исходный файл. Чтобы сохранить результат, перенаправьте вывод в файл или используйте флаг -o:
sort -o sortedfile filenameПример:
sort -o sorted.txt textfile.txtВывод после команды:
Сортировка нескольких файлов сразу
Передайте несколько имён файлов через пробел — sort объединит (merge) их содержимое и отсортирует общую последовательность:
sort textfile.txt textfile2.txtОбратная сортировка
Флаг -r инвертирует порядок:
sort -r textfile.txtЧисловая сортировка
Для корректной сортировки чисел используйте -n. Это важно, потому что лексикографическая сортировка неправильно упорядочит числа (например, 100 раньше 2).
sort -n numbers.txtДля сортировки чисел в обратном порядке комбинируйте -r и -n:
sort -rn numbers.txtЕсли числа в формате «человеческих размеров» (например, 1K, 2M), используйте -h для human-numeric-suffix (в GNU sort):
sort -h sizes.txtИгнорирование регистра
Чтобы не учитывать регистр букв при сравнении, используйте -f или –ignore-case:
sort -f textfile.txt
# или
sort --ignore-case textfile.txtСортировка по месяцам
Флаг -M сортирует строки, содержащие названия месяцев, в календарном порядке (Jan, Feb, … или локализованные названия месяцев в вашей локали):
sort -M textfile2.txtИгнорирование ведущих пробелов
Флаг -b заставляет sort пропускать начальные пробелы и табуляции при сравнении строк:
sort -b fileblanks.txtСортировка по колонке
Часто файлы имеют несколько колонок, разделённых пробелами или табуляцией. Флаг -k указывает ключ (столбец) для сравнения.
Пример: сортировка по восьмому столбцу в обратном числовом порядке:
sort -k8 -rn output.txtЕсли разделитель колонок — не пробел, укажите его через -t:
sort -t',' -k3,3 file.csvИспользование конвейеров и других команд
sort часто применяется в пайплайнах. Пример: сортировать вывод ls по размеру файла:
ls -la | sort -k5 -rnЕсли нужно выбрать уникальные значения после сортировки, комбинируйте sort и uniq (или используйте -u):
# предпочтительный способ: sort + uniq
sort file.txt | uniq
# или встроенный -u
sort -u file.txtСлучайная сортировка
Флаг -R выдаёт случайный порядок строк (зависит от реализации и версии sort):
sort -R textfile.txtСортировка версий пакетов
Флаг -V или –version-sort подходит для строк с версионными номерами (1.2, 1.10, 1.2.3):
sort -V version.txt
# или
sort --version-sort version.txtПроверка, отсортирован ли файл
Флаг -c проверяет, отсортирован ли файл по указанным критериям. Если файл корректно отсортирован — sort ничего не выводит и возвращает код 0. В противном случае он напечатает первую строку, нарушающую порядок.
sort -c textfile.txtЕсли вы хотите проверить файл sorted.txt после создания:
sort -c sorted.txtПроверка сортировки с флагами (пример для чисел в обратном порядке):
sort -c -rn numbers.txtПример конвейера, где мы сортируем и сохраняем, затем проверяем:
sort -o sorted.txt -rn numbers.txt
sort -c -rn sorted.txtСортировка с удалением дубликатов
Флаг -u (или –unique) заставляет sort выводить только уникальные строки:
sort -u duplicate.txtЭто полезно, когда нужно одновременно упорядочить данные и избавиться от повторов. Если важна строжайшая фильтрация уникальности с учётом только определённой колонки, комбинируйте -k и -u.
Полезные флаги и краткая шпаргалка
- -o FILE — вывести результат в FILE.
- -n — числовая сортировка.
- -r — обратный порядок.
- -f, –ignore-case — игнорировать регистр.
- -u, –unique — выводить только уникальные строки.
- -k POS[,POS] — ключ (столбец) для сортировки.
- -t CHAR — символ-разделитель полей.
- -M — сортировать по месяцам.
- -b — игнорировать ведущие пробелы.
- -c — проверить, отсортирован ли файл.
- -V, –version-sort — сортировать версии.
- -h — human-numeric (размеры с суффиксами K/M).
- -S SIZE — ограничить объем памяти для сортировки (например, 50%).
- –parallel=N — использовать N потоков (если поддерживается).
- -T DIR, –temporary-directory=DIR — временная директория для промежуточных файлов.
Когда sort даёт неожиданные результаты (панель с распространёнными причинами)
- Локаль влияет на порядок символов. Решение: использовать LC_ALL=C для байтового порядка.
- Различные разделители столбцов. Решение: явно указать -t.
- Числовые строки содержат не только цифры (постфикс, символы). Решение: использовать -g или предварительно извлечь числовую часть с awk.
- Большие файлы не помещаются в память. Решение: использовать –temporary-directory, -S и –parallel или внешнее разбиение и merge.
- Неправильная сортировка «человеческих» размеров. Решение: использовать -h.
Альтернативные подходы
- uniq: удаляет дубликаты, но работает корректно только на уже отсортированных входных данных.
- awk/perl/python: гибкая фильтрация и сортировка, если требуется сложная логика ключей или преобразования перед сравнением.
- sort + join: для операций по ключу между файлами.
Пример, когда awk лучше: нестандартная нормализация поля перед сравнением (убрать скобки, привести число к float).
Практическая методика для больших файлов
- Если важен детерминированный порядок — выставьте LC_ALL=C.
- Попробуйте sort с -S и –temporary-directory, чтобы не переполнить память.
- Если файл слишком большой, разбейте его на части (split), отсортируйте части, затем объедините через sort –merge или просто sort с несколькими входами.
- Для многопроцессорных машин добавьте –parallel.
Критерии приёмки (тесты для проверки корректности сортировки)
- Файл с числами: после sort -n результат должен быть в неубывающем порядке.
- Файл с версиями: sort -V должен расположить 1.2 перед 1.10.
- Повторяющиеся строки: sort -u должен вернуть только уникальные строки.
- Проверка колонок: sort -t’,’ -k3,3 file.csv — значения в 3-й колонке должны быть упорядочены.
- Проверка стабильности (если требуется): сравнить исходный порядок эквивалентных ключей.
Роль-базированные чек-листы
Для системного администратора
- Использовать LC_ALL=C для детерминированной сортировки логов.
- Для больших лог-файлов применять -S, -T и –parallel.
- Хранить временные файлы в защищённой директории с правильными правами.
Для разработчика
- Для сравнения семплов использовать sort -u и diff.
- При парсинге CSV указывать -t и точные диапазоны -k.
- Использовать sort -V для списков релизов.
Для аналитика данных
- Проверять пустые и NULL-поля перед сортировкой.
- Приводить данные к нормализованному виду (trim, lowercase) перед сортировкой.
- Использовать pipe: preprocess | sort -kX | postprocess.
Краткая шпаргалка команд (кейсы использования)
- Отсортировать и сохранить:
sort -o out.txt in.txt- Удалить дубликаты и сохранить:
sort -u in.txt > unique.txt- Сортировать по 3-й колонке CSV (числово):
sort -t',' -k3,3n data.csv- Сортировать файлы и вывести только первые 10 строк результата:
sort big.txt | head- Сортировать список файлов по размеру (ls):
ls -la | sort -k5 -rnМодель рассуждения: как думать о sort
Ментальная модель: представьте sort как функцию сравнения, применяемую к каждой паре строк с набором правил (флаги). Вы выбираете «ключ» и «правила сравнения», а sort применяет их к каждой строке и выстраивает порядок по сравнению.
Если нужно, чтобы строки группировались по ключу, используйте -k; если важен числовой порядок — -n; если порядок должен быть устойчивым к регистру — -f.
Мерmaid: выбор флагов (диаграмма выбора)
flowchart TD
A[Нужно отсортировать файл?] --> B{Тип данных}
B --> |Числа| C[Используйте -n]
B --> |Размеры с суффиксом '1K'| D[Используйте -h]
B --> |Месяцы| E[Используйте -M]
B --> |Версии| F[Используйте -V]
B --> |Строки| G[Используйте -f для игнор. регистра]
C --> H{Нужен обратный порядок?}
H --> |Да| I[Добавьте -r]
H --> |Нет| J[Без -r]
G --> K{По колонке?}
K --> |Да| L[Добавьте -k и -t]
K --> |Нет| M[Обычная сортировка]Советы по безопасности и приватности
- Временные и выходные файлы могут содержать чувствительные данные. Убедитесь, что регион временных директорий использует корректные права (chmod) и находится на зашифрованном разделе при необходимости.
- Не публикуйте логи и файлы с персональными данными без анонимизации.
Совместимость и заметки о локали
- Поведение сортировки зависит от реализации sort (GNU coreutils vs BSD). Некоторые флаги (например, -h) доступны в GNU sort.
- Для предсказуемого порядка используйте LC_ALL=C.
Краткая галерея крайних случаев
- Файл с табуляцией vs пробелами: указывать -t поможет избежать ошибок.
- Очень длинные строки: могут повлиять на память; используйте -S и –temporary-directory.
- Мультиязычные строки: локаль определяет порядок букв с диакритикой.
Заключение
sort — мощный, гибкий инструмент для упорядочивания текстовых данных в Linux. Понимание ключевых флагов, локали и поведения при обработке больших файлов позволяет применять его в большинстве сценариев: от простых задач по сортировке до интеграции в ETL-процессы или реструктурирования логов.
Пробуйте комбинации флагов на тестовых данных, используйте LC_ALL=C для детерминированного результата и комбинируйте sort с awk, uniq и другими инструментами для получения нужного результата.
Короткое резюме:
- Выбирайте ключи (-k), режим сравнения (-n, -h, -V, -M) и дополнительные параметры (-r, -u, -f).
- Для больших файлов настраивайте память и временные директории.
- Проверяйте корректность с помощью -c и тестовых примеров.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента