С чего начать Первые шаги трек · 15 ступеней
Linux Labs

sort — сортировка строк

5 мин Ubuntu 24.04 · GNU coreutils 9.4

Команда sort упорядочивает строки файла или вывода: как текст, как числа (-n), по колонке (-k), по убыванию (-r).

Шпаргалка

8 команд Версия для печати
  • sort file.txt по алфавиту
  • sort -n nums.txt как числа: 2 9 10 100
  • sort -rn nums.txt числа по убыванию
  • sort -k2,2 table.txt по второй колонке
  • sort -t: -k3,3n /etc/passwd разделитель «:», 3-я колонка
  • sort -u names.txt отсортировать и убрать дубли
  • du -sh /var/log/* | sort -h размеры 4K 512M 1G
  • sort | uniq -c | sort -rn частота строк, сверху частые

Обзор

sort читает все строки, упорядочивает их и печатает. Исходный файл не меняется. Без ключей строки сравниваются как текст, символ за символом. Поэтому числа без -n встают «по первой цифре»:

text
student@ubuntu:~$ printf '10\n9\n100\n2\n' | sort
10
100
2
9
student@ubuntu:~$ printf '10\n9\n100\n2\n' | sort -n
2
9
10
100

Колонка для sort — кусок строки между разделителями. По умолчанию колонки разделяют пробелы и табуляции, свой разделитель задаёт -t. Ключ -k2,2 значит «сравнивать с колонки 2 по колонку 2». Если написать только -k2, сравнение пойдёт от второй колонки до конца строки.

В конвейере sort обычно стоит перед uniq: тот убирает только соседние повторы, а после сортировки одинаковые строки как раз оказываются рядом.

Ключи

11

Буквы порядка можно прицепить к колонке: -k3,3n — третья колонка как число, -k2,2r — вторая по убыванию. Полный список — man sort.

Ключ Что делает Пример
-n --numeric-sort Сравнивать как числа, а не как текст. sort -n nums.txt
-r --reverse Обратный порядок — от большего к меньшему. sort -rn nums.txt
-k --key N[,M] Сравнивать по колонкам с N по M; без M — от N до конца строки. sort -k2,2 table.txt
-t --field-separator C Разделитель колонок вместо пробелов, например «:» или «,». sort -t: -k3,3n /etc/passwd
-u --unique Оставить по одной строке из одинаковых. sort -u names.txt
-h --human-numeric-sort Сравнивать размеры с суффиксами K, M, G. du -sh * | sort -h
-o --output FILE Записать результат в файл; можно в тот же, что читается. sort -o names.txt names.txt
-f --ignore-case Не различать заглавные и строчные буквы. sort -f names.txt
-b --ignore-leading-blanks Не учитывать пробелы в начале колонки. sort -b -k2,2 table.txt
-V --version-sort Сортировать номера версий: 1.2 < 1.9 < 1.10. sort -V versions.txt
-c --check Проверить, отсортирован ли ввод; печатает первую строку не по порядку. sort -c list.txt

Ничего не найдено. Попробуй запрос короче.

Рецепты

7

Какие строки встречаются чаще всего

bash
cut -d' ' -f1 access.log | sort | uniq -c | sort -rn | head

Первый sort собирает одинаковые адреса подряд, uniq -c считает их, второй sort -rn ставит большие счётчики наверх, head оставляет десять.

Таблица по числовой колонке

bash
sort -t: -k3,3n /etc/passwd | cut -d: -f1,3   # пользователи по UID
ps -eo pid,rss,comm | sort -k2,2nr | head -5  # пять процессов по памяти

Размеры с буквами K, M, G

bash
du -sh /var/log/* 2>/dev/null | sort -h       # от меньшего к большему
du -sh /var/log/* 2>/dev/null | sort -rh | head -3

-n прочитает 512M как 512, а 1G как 1 — порядок выйдет неверный. -h понимает суффиксы.

Несколько ключей

bash
sort -k2,2 -k1,1n table.txt   # по 2-й, при равенстве — по 1-й

Версии и имена файлов с номерами

bash
printf 'app-1.10\napp-1.9\napp-1.2\n' | sort -V
# app-1.2  app-1.9  app-1.10 — без -V 1.10 встал бы раньше 1.2

Записать результат в тот же файл

bash
sort -o names.txt names.txt

sort names.txt > names.txt оставит пустой файл, а -o пишет только после чтения.

Проверить, отсортирован ли файл

bash
sort -c list.txt        # sort: list.txt:2: disorder: a
sort -C list.txt; echo $?   # молча: 0 — да, 1 — нет

Неполадки

7

10 стоит раньше 9

Сравнение идёт как текст. Для чисел нужен -n, для размеров с суффиксами — -h.

sort -k2 сортирует не только по второй колонке

-k2 значит «с колонки 2 до конца строки», поэтому при равных значениях решают следующие колонки. Ограничь ключ: -k2,2.

Порядок заглавных и строчных не тот, что ждал

Порядок текста задаёт локаль. В локали C заглавные идут раньше всех строчных, в en_US.UTF-8 регистр почти не учитывается. Одинаковый результат на любой машине — LC_ALL=C sort. Регистр не различать — -f.

sort: cannot read: x: No such file or directory

Файла нет по этому пути. Проверь имя через ls и текущий каталог через pwd.

sort: invalid number at field start

После -k должен идти номер колонки: -k2, -k2,2n. Буквы без номера (-k n) sort не принимает. Колонки считаются с единицы: -k0 — ошибка field number is zero.

Числа с пробелами в начале сортируются странно

Без -n и -b ведущие пробелы входят в сравнение. Добавь -b или сравнивай числом -n.

После sort file > file файл пуст

Оболочка обнулила файл для записи раньше, чем sort его прочитал. Используй sort -o file file — см. перенаправление вывода.

См. также

  • uniq — посчитать и убрать повторы после сортировки.
  • cut — вырезать колонку перед сортировкой.
  • wc — посчитать строки результата.
  • head — оставить верх отсортированного списка.
  • redirection — конвейер | и запись результата в файл.
  • text-tools — tr, paste, column, comm и другие звенья конвейера.
Загрузка…