Добавить в цитаты Настройки чтения

Страница 64 из 113



Существует несколько способов преобразовать файлы из формата DOS в формат Unix. Во многих системах Linux имеются программы unix2dos и dos2unix для преобразования текстовых файлов в формат DOS и обратно. Однако если в вашей системе нет программы dos2unix, не волнуйтесь. Процесс преобразования текста из формата DOS в формат Unix очень прост — достаточно лишь удалить ненужные возвраты каретки. Это можно сделать с помощью пары программ, с которыми мы познакомимся ниже в этой главе.

Программа cat имеет также параметры, используемые для изменения текста. Наиболее известными являются -n, добавляющий номера строк, и -s, подавляющий вывод множества пустых строк, идущих подряд. Давайте продемонстрируем их:

[[email protected]/* */ ~]$ cat > foo.txt

The quick brown fox

 

 

jumped over the lazy dog.

[[email protected]/* */ ~]$ cat -ns foo.txt

     1  The quick brown fox

     2

     3  jumped over the lazy dog.

[[email protected]/* */ ~]$

В этом примере мы создали новую версию тестового файла foo.txt, содержащую две строки, разделенные двумя пустыми строками. После обработки текста командой cat с параметрами -ns одна пустая строка была удалена, а остальные строки пронумерованы. Хотя это не самая сложная обработка текста, все же это обработка.

sort — сортировка строк текстовых файлов

Программа sort сортирует содержимое стандартного ввода или одного или нескольких файлов, указанных в командной строке, и записывает результаты в стандартный вывод. Применив тот же прием, который мы использовали совместно с командой cat, можно продемонстрировать обработку стандартного ввода.

[[email protected]/* */ ~]$ sort > foo.txt

c

b

a

[[email protected]/* */ ~]$ cat foo.txt

a

b

c

После запуска команды мы ввели буквы c, b и a, а затем признак конца файла с помощью комбинации CTRL+D. Затем просмотрели получившийся файл и увидели, что строки в нем отсортированы.

Поскольку sort может принимать несколько файлов в аргументах командной строки, существует возможность объединить множество файлов в один отсортированный файл. Например, если у вас имеется три файла и вам нужно объединить их в один отсортированный файл, это можно выполнить следующим образом:

sort file1.txt file2.txt file3.txt > final_sorted_list.txt

Программа sort имеет несколько интересных параметров. Их неполный список приводится в табл. 20.1.

Таблица 20.1. Часто используемые параметры команды sort

Параметр

Длинный параметр

Описание

-b

--ignore-leading-blanks

По умолчанию сортировка выполняется с учетом содержимого всей строки, начиная с первого символа. Этот параметр заставляет sort игнорировать начальные пробелы в строках и при сортировке начинать сравнение строк с первых непробельных символов

-f

--ignore-case

Выполнять сортировку без учета регистра символов

-n

--numeric-sort

Выполнять сортировку, опираясь на числовые значения строк. Этот параметр позволяет осуществлять сортировку в соответствии с числовыми значениями, а не по алфавиту

-r

--reverse

Сортировать в обратном порядке. Строки в результате будут следовать в порядке убывания, а не возрастания

-k

--key=поле1[,поле2]

Сортировать по ключевым полям, начиная с поля1 и заканчивая полем2, а не по всей строке

-m

--merge

Интерпретировать каждый аргумент как имя предварительно отсортированного файла. Позволяет объединить несколько файлов в общий результат без выполнения дополнительной сортировки

-o

--output=файл

Записать результат сортировки не в стандартный вывод, а в указанный файл

-t



--field-separator=символ

Определяет символ, разделитель полей. По умолчанию в качестве разделителя используются пробелы и символы табуляции

Имена большинства параметров из представленных выше говорят сами за себя, однако некоторые требуют дополнительных пояснений. Прежде всего рассмотрим параметр -n, используемый для сортировки по числовым значениям. Этот параметр позволяет сортировать строки по их числовым значениям. Продемонстрировать действие этого параметра можно на примере сортировки результатов команды du, чтобы определить каталог, занимающий больший объем дискового пространства. Обычно команда du выводит результаты, отсортированные по именам каталогов:

[[email protected]/* */ ~]$ 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 самых объемных каталогов:

[[email protected]/* */ ~]$ 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?

[[email protected]/* */ ~]$ 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 aco

-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.

[[email protected]/* */ ~]$ 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 часто вовлекается в обработку табличных данных, таких как результат команды ls выше. Если воспользоваться терминологией баз данных, об этой таблице можно сказать, что каждая строка — это запись и каждая запись состоит из множества полей, таких как атрибуты файла, счетчик ссылок, имя файла, размер файла и т.д. Программа sort способна обрабатывать поля по отдельности. Согласно той же терминологии баз данных, мы можем указать одно или несколько ключевых полей, которые должны использоваться как ключи сортировки. В примере, приведенном выше, мы добавили параметры n и r, чтобы выполнить сортировку по числовым значениям в порядке убывания, а также параметр -k с аргументом 5, чтобы указать, что сортировка должна выполняться по пятому полю.