Чтение онлайн

ЖАНРЫ

Командная строка Linux
Шрифт:

– 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 часто вовлекается в обработку табличных данных, таких как результат команды ls выше. Если воспользоваться терминологией баз

данных, об этой таблице можно сказать, что каждая строка — это запись и каждая запись состоит из множества полей, таких как атрибуты файла, счетчик ссылок, имя файла, размер файла и т.д. Программа sort способна обрабатывать поля по отдельности. Согласно той же терминологии баз данных, мы можем указать одно или несколько ключевых полей, которые должны использоваться как ключи сортировки. В примере, приведенном выше, мы добавили параметры n и r, чтобы выполнить сортировку по числовым значениям в порядке убывания, а также параметр -k с аргументом 5, чтобы указать, что сортировка должна выполняться по пятому полю.

Параметр очень интересен и обладает множеством любопытных свойств, но прежде чем приступить к их обсуждению, поговорим о том, как 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

Ubuntu 6.06 06/01/2006

Ubuntu 8.10 10/30/2008

Fedora 5 03/20/2006

С помощью текстового редактора (например, vim) введите эти данные и сохраните в файле с именем distros.txt.

Далее попробуем отсортировать файл и посмотрим, что из этого получится:

[me@linuxbox ~]$ sort distros.txt

Fedora 10 11/25/2008

Fedora 5 03/20/2006

Fedora 6 10/24/2006

Fedora 7 05/31/2007

Fedora 8 11/08/2007

Fedora 9 05/13/2008

SUSE 10.1 05/11/2006

SUSE 10.2 12/07/2006

SUSE 10.3 10/04/2007

SUSE 11.0 06/19/2008

Ubuntu 6.06 06/01/2006

Ubuntu 6.10 10/26/2006

Ubuntu 7.04 04/19/2007

Ubuntu 7.10 10/18/2007

Ubuntu 8.04 04/24/2008

Ubuntu 8.10 10/30/2008

У

нас это почти получилось. Единственная проблема возникла с сортировкой номеров версий Fedora. Так как в лексикографическом смысле 1 предшествует 5, версия 10 оказалась вверху, тогда как версии 9 — внизу.

Чтобы исправить эту ошибку, выполним сортировку по нескольким ключам. Итак, нам нужно выполнить сортировку по первому полю в алфавитном порядке, а затем по второму полю в числовом порядке. Программа sort позволяет указать в командной строке несколько параметров -k, чтобы можно было определить несколько ключей сортировки. В действительности в ключ можно включать диапазон полей. Если диапазон не определен (как в примерах, приведенных выше), sort использует в качестве ключа часть строки, начинающуюся с указанного поля и простирающуюся до конца строки.

Вот как выглядит синтаксис сортировки по нескольким ключам:

[me@linuxbox ~]$ sort --key=1,1 --key=2n distros.txt

Fedora 5 03/20/2006

Fedora 6 10/24/2006

Fedora 7 05/31/2007

Fedora 8 11/08/2007

Fedora 9 05/13/2008

Fedora 10 11/25/2008

SUSE 10.1 05/11/2006

SUSE 10.2 12/07/2006

SUSE 10.3 10/04/2007

SUSE 11.0 06/19/2008

Ubuntu 6.06 06/01/2006

Ubuntu 6.10 10/26/2006

Ubuntu 7.04 04/19/2007

Ubuntu 7.10 10/18/2007

Ubuntu 8.04 04/24/2008

Ubuntu 8.10 10/30/2008

Здесь для ясности использовались имена параметров в длинной форме, однако с тем же успехом можно было бы передать параметры -k 1,1 -k 2n. В аргументе для первого экземпляра параметра ключа мы указали диапазон полей, входящих в первый ключ. Так как сортировка должна выполняться только по первому полю, мы указали диапазон 1,1, что означает: «начиная с поля 1 и заканчивая полем 1». Второму экземпляру мы передали аргумент 2n, который означает: «ключом сортировки является второе поле и сортировка выполняется в порядке числовых значений». В конце определения ключа допускаются однобуквенные имена параметров, они указывают на тип сортировки. Имена этих однобуквенных параметров совпадают с именами глобальных параметров программы sort: b (игнорировать начальные пробелы), n (числовая сортировка), r (сортировка в обратном порядке) и т.д.

Третье поле в списке содержит дату в формате, неудобном для сортировки. В компьютере даты обычно приводятся к виду ГГГГ-ММ-ДД, что упрощает сортировку в хронологическом порядке, но здесь используется американский формат ММ/ДД/ГГГГ. Как же тогда отсортировать этот список в хронологическом порядке?

К счастью, sort предоставляет такую возможность. Параметр --key позволяет определять смещения внутри полей, чтобы в качестве ключей можно было использовать части полей:

[me@linuxbox ~]$ sort -k 3.7nbr -k 3.1nbr -k 3.4nbr distros.txt

Fedora 10 11/25/2008

Ubuntu 8.10 10/30/2008

SUSE 11.0 06/19/2008

Fedora 9 05/13/2008

Ubuntu 8.04 04/24/2008

Fedora 8 11/08/2007

Ubuntu 7.10 10/18/2007

SUSE 10.3 10/04/2007

Fedora 7 05/31/2007

Ubuntu 7.04 04/19/2007

SUSE 10.2 12/07/2006

Ubuntu 6.10 10/26/2006

Поделиться с друзьями: