COREUTILS. Команда sort. Сортировка вывода программ

07/08/2015

Скорее всего пакет coreutils у вас уже установлен, хотя бы потому, что удалить его нельзя, но на всякий случай проверьте:

dpkg -l | grep coreutils      #для debian-based дистрибутивов

Если в первой колонке вывода будет стоять буква "i", означающая installed, значит все в порядке.

Пользоваться утилитой sort для сортировки вывода программ предельно просто. Для этого достаточно просто перенаправить вывод какой-либо программы на поток ввода sort:

ls | sort -d

Данная конструкция сначала вызовет команду ls, которая считает содержимое каталога, а затем передаст результат команде sort, которая отсортирует его по алфавиту (ключ -d указывает использовать алфавит в качестве шаблона).

Другой пример использования команды sort в linux - это сортировка содержимого файла. Отсортируем, например, строки, содержащиеся в файле /etc/passwd, с целью получения имен пользователей по алфавиту:

sort -d /etc/passwd

Но что делать, если вы хотите, используя тот же файл, отсортировать строки уже не по имени пользователя, а, например, по их уникальному идентификатору (UID)? Утилита sort умеет работать и с таблицами - сортировать по столбцу. Вернее изначально, sort как раз и работает с таблицами, вот только в качестве разделителя она по-умолчанию использует пробел и знак табуляции для разделения столбцов, знак переноса строки для разделения строк. Так как файл /etc/passwd использует ":" для разделения столбцов, то этот символ нужно передать sort при помощи ключа "-t" явно, а далее просто указать номер столбца с помощью ключа "-k". Но только ничего не получится, если опять же не указать шаблон. В данном случае нам понадобиться сортировать числа - поэтому вместо "-d" (по алфавиту) стаим -n (по числам). Вот, что получилось:

sort -n -t : -k 2,2 /etc/passwd

Внимательный читатель спросит: "Почему в качестве параметра ключа "-k" мы указали не просто номер столбца, а номер столбца через запятую с его же номером?". Ответ прост. Ключ "-k" очень мощный. Он позволяет гибко выбирать сортируемое поле. Используя предыдущий пример, немного изменим параметры ключа "-k":

sort -n -t : -k 2.2,2.4 /etc/passwd

Добавив точку, мы тем самым сузили диапазон для проведения сортировки. Теперь команда расшифровывается так: отсортируй содержимое файл /etc/passwd, приняв в качестве исходных данных символ со второго по четвертый во 2-ом столбце.

Приведем еще один классный пример. Представим, что у нас закончилось место в разделе /home, и мы хотим узнать 10 самых объемных каталогов и файлов внутри /home с целью понять, куда копать:

du -a /home | sort -n | tail

Сначала командой du мы проходимся по всем файлам и подкаталогам /home, затем сортируем полученные строки по возрастанию и, наконец, tail'ом отображаем последние 10

На этом возможности команды soft не исчерпываются. Полезным может оказаться ключ "-r", позволяющий сортировать строки в обратном порядке. Его не стоит путать с ключом "-R", который совершенно случайным образом сортирует содержимое файла или вывода программы. Должно быть такая функция тоже кому-то будет полезной.

Также стоит обратить ваше внимание на ключ "-u", который заставляет sort выводит только уникальные значения. Т.е., если при сортировке выяснится, что сортируемые значения одинаковы, будет выведено только то, которое первым попало в поле зрения sort. Ключ "-u" не работает для значений, например "1" и " 1" (один и пробел один), так как пробел тоже считается символом. Чтобы этого избежать применяют ключ "-b", позволяющий игнорировать пробелы перед сортируемой строкой.

Темы: