Командная строка Linux
Шрифт:
– m
– -merge
Интерпретировать каждый аргумент как имя предварительно отсортированного файла. Позволяет объединить несколько файлов в общий результат без выполнения дополнительной сортировки
– o
– -output=файл
Записать результат сортировки не в стандартный вывод, а в указанный файл
– t
– -field-separator=символ
Определяет символ, разделитель полей. По умолчанию в качестве разделителя используются пробелы и символы табуляции
Имена большинства параметров из представленных выше говорят сами за себя, однако
[me@linuxbox ~]$ du -s /usr/share/* | head
252 /usr/share/aclocal
96 /usr/share/acpi-support
8 /usr/share/adduser
196 /usr/share/alacarte
344 /usr/share/alsa
8 /usr/share/alsa-base
12488 /usr/share/anthy
8 /usr/share/apmd
21440 /usr/share/app-install
48 /usr/share/application-registry
В этом примере мы передали результаты по конвейеру программе head, чтобы ограничить число результатов первыми 10 строками. Мы можем изменить эту команду, добавив сортировку по числовым значениям, чтобы получить 10 самых объемных каталогов:
[me@linuxbox ~]$ du -s /usr/share/* | sort -nr | head
509940 /usr/share/locale-langpack
242660 /usr/share/doc
197560 /usr/share/fonts
179144 /usr/share/gnome
146764 /usr/share/myspell
144304 /usr/share/gimp
135880 /usr/share/dict
76508 /usr/share/icons
68072 /usr/share/apps
62844 /usr/share/foomatic
С помощью параметров -nr мы получили сортировку по числовым значениям в обратном порядке, в результате наибольшие значения оказались в начале списка. Такой способ сортировки стал возможен, потому что числовые значения находятся в начале каждой строки. Но как быть, если потребуется отсортировать строки по числовым значениям, находящимся в середине строки, как, например, в результатах команды ls -l?
[me@linuxbox ~]$ ls -l /usr/bin | head
total 152948
– rwxr-xr-x 1 root root 34824 2012-04-04 02:42 [
– rwxr-xr-x 1 root root 101556 2011-11-27 06:08 a2p
– rwxr-xr-x 1 root root 13036 2012-02-27 08:22 aconnect
– rwxr-xr-x 1 root root 10552 2011-08-15 10:34 acpi
– rwxr-xr-x 1 root root 3800 2012-04-14 03:51 acpi_fakekey
– rwxr-xr-x 1 root root 7536 2012-04-19 00:19 acpi_listen
– rwxr-xr-x 1 root root 3576 2012-04-29 07:57 addpart
– rwxr-xr-x 1 root root 20808 2012-01-03 18:02 addr2line
– rwxr-xr-x 1 root root 489704 2012-10-09 17:02 adept_batch
Забудем на время, что ls может сортировать свои результаты по размеру, и выполним сортировку с помощью sort.
[me@linuxbox ~]$ ls -l /usr/bin | sort -nr -k 5 | head
– rwxr-xr-x 1 root root 8234216 2012-04-07 17:42 inkscape
– rwxr-xr-x 1 root root 8222692 2012-04-07 17:42 inkview
– rwxr-xr-x 1 root root 3746508 2012-03-07 23:45 gimp-2.4
– rwxr-xr-x 1 root root 3654020 2012-08-26 16:16 quanta
– rwxr-xr-x 1 root root 2928760 2012-09-10 14:31 gdbtui
– rwxr-xr-x 1 root root 2928756 2012-09-10 14:31 gdb
– rwxr-xr-x 1 root root 2602236 2012-10-10 12:56 net
– rwxr-xr-x 1 root root 2304684 2012-10-10 12:56 rpcclient
– rwxr-xr-x 1 root root 2241832 2012-04-04 05:56 aptitude
– rwxr-xr-x 1 root root 2202476 2012-10-10 12:56 smbcacls
Программа sort
Параметр очень интересен и обладает множеством любопытных свойств, но прежде чем приступить к их обсуждению, поговорим о том, как sort определяет поля. Рассмотрим очень простой текстовый файл, содержащий единственную строку с именем автора этой книги:
William Shotts
По умолчанию sort «видит» в этой строке два поля. Первое поле содержит последовательность символов William, второе — последовательность символов Shotts, то есть пробельные символы (пробелы и символы табуляции) интерпретируются как разделители полей, и эти разделители включаются в поле при выполнении сортировки.
Взглянув еще раз на любую строку в выводе нашей команды ls, можно сказать, что она содержит восемь полей и пятое поле хранит размер файла:
– rwxr-xr-x 1 root root 8234216 2012-04-07 17:42 inkscape
Для следующей серии экспериментов возьмем файл с историей выпуска новых версий трех популярных дистрибутивов Linux в период с 2006 по 2008 год. Каждая строка в файле содержит три поля: название дистрибутива, номер версии и дата выпускав формате ММ/ДД/ГГГГ:
SUSE 10.2 12/07/2006
Fedora 10 11/25/2008
SUSE 11.0 06/19/2008
Ubuntu 8.04 04/24/2008
Fedora 8 11/08/2007
SUSE 10.3 10/04/2007
Ubuntu 6.10 10/26/2006
Fedora 7 05/31/2007
Ubuntu 7.10 10/18/2007
Ubuntu 7.04 04/19/2007
SUSE 10.1 05/11/2006
Fedora 6 10/24/2006
Fedora 9 05/13/2008