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

ЖАНРЫ

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

Прежде чем двинуться дальше, прочитайте страницу справочного руководства (man) для команды cat, так как она имеет несколько очень интересных параметров.

Конвейеры

«Умение» команд читать данные со стандартного ввода и выводить результаты в стандартный вывод используется механизмом командной оболочки, который называется конвейером. C помощью оператора конвейера6 | (вертикальная черта) стандартный вывод одной команды можно связать со стандартным вводом другой.

команда1 | команда2

Для демонстрации

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

[me@linuxbox ~]$ ls -l /usr/bin | less

Это очень удобно! С помощью этого приема можно со всем комфортом исследовать вывод любой команды, посылающей результаты на стандартный вывод.

Фильтры

Конвейеры часто используются для выполнения сложных операций с данными. Они позволяют объединить вместе несколько команд. Часто команды, используемые таким способом, называют фильтрами. Фильтры принимают ввод, изменяют его определенным образом и выводят результат. Первый из таких фильтров, который мы опробуем, — команда sort. Представьте, что нам необходимо составить список всех выполняемых программ в каталогах /bin и /usr/bin, расположив их по алфавиту, и затем вывести его:

[me@linuxbox ~]$ ls /bin /usr/bin | sort | less

Поскольку в команде указаны два каталога (/bin и /usr/bin), вывод команды ls будет состоять из двух сортированных списков, по одному для каждого каталога. Добавив команду sort в конвейер, мы изменили данные, чтобы получить единый сортированный список.

uniq — поиск или удаление повторяющихся строк

Команда uniq часто используется в комбинации с командой sort. uniq принимает сортированный список данных либо со стандартного ввода, либо из файла, имя которого можно передать в единственном аргументе (за подробностями обращайтесь к странице справочного руководства (man) для команды uniq), и по умолчанию удаляет повторяющиеся строки из списка. Поэтому, чтобы гарантировать отсутствие дубликатов в нашем списке (то есть любых программ с одинаковыми именами в каталогах /bin и /usr/bin), добавим uniq в конвейер:

[me@linuxbox ~]$ ls /bin /usr/bin | sort | uniq | less

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

[me@linuxbox ~]$ ls /bin /usr/bin | sort | uniq -d | less

wc — вывод числа строк, слов и байтов

Команда wc (word count — счетчик слов) используется для подсчета числа строк, слов и байтов в файлах. Например:

[me@linuxbox ~]$ wc ls-output.txt

7902 64566 503634 ls-output.txt

В данном случае команда вывела три числа: число строк, число слов и число байтов в файле ls-output.txt. Подобно предыдущим командам, она может вызываться без аргументов, и в этом случае wc будет принимать данные со стандартного ввода. Параметр -l

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

[me@linuxbox ~]$ ls /bin /usr/bin | sort | uniq | wc -l

2728

grep — поиск строк, соответствующих шаблону

grep — очень мощная программа, она часто используется для поиска в файлах текста по шаблону:

grep шаблон [файл...]

Когда grep находит в файле совпадение с «шаблоном», она выводит строку с найденным совпадением. Шаблоны, используемые командой grep для поиска, могут быть очень сложными, но сейчас мы рассмотрим только поиск прямого совпадения с текстом. Более сложные шаблоны, которые называют регулярными выражениями, мы рассмотрим в главе 19.

Допустим, что нам нужно найти все файлы в списке программ, которые имеют в своем имени последовательность символов zip. Результаты такого поиска могут подсказать нам, какие программы в системе имеют отношение к сжатию файлов. Сделать это можно так:

[me@linuxbox ~]$ ls /bin /usr/bin | sort | uniq | grep zip

bunzip2

bzip2

gunzip

gzip

unzip

zip

zipcloak

zipgrep

zipinfo

zipnote

zipsplit

Команда grep имеет пару удобных параметров: -i требует от grep игнорировать регистр символов в процессе поиска (обычно поиск выполняется с учетом регистра символов), -v требует от grep выводить только строки, где совпадение с шаблоном не найдено.

head/tail — вывод первых/последних строк из файлов

Иногда требуется выводить не все результаты работы команды, а только несколько первых или несколько последних строк. Команда head выводит первые 10 строк из файла, а tail — последние 10 строк. По умолчанию обе команды выводят 10 строк текста, но это число можно изменить с помощью параметра -n:

[me@linuxbox ~]$ head -n 5 ls-output.txt

total 343496

– rwxr-xr-x 1 root root 31316 2011-12-05 08:58 [

– rwxr-xr-x 1 root root 8240 2011-12-09 13:39 411toppm

– rwxr-xr-x 1 root root 111276 2011-11-26 14:27 a2p

– rwxr-xr-x 1 root root 25368 2010-10-06 20:16 a52dec

[me@linuxbox ~]$ tail -n 5 ls-output.txt

– rwxr-xr-x 1 root root 5234 2011-06-27 10:56 znew

– rwxr-xr-x 1 root root 691 2009-09-10 04:21 zonetab2pot.py

– rw-r--r-- 1 root root 930 2011-11-01 12:23 zonetab2pot.pyc

– rw-r--r-- 1 root root 930 2011-11-01 12:23 zonetab2pot.pyo

lrwxrwxrwx 1 root root 6 2012-01-31 05:22 zsoelim -> soelim

Их также можно использовать в конвейерах:

[me@linuxbox ~]$ ls /usr/bin | tail -n 5

znew

zonetab2pot.py

zonetab2pot.pyc

zonetab2pot.pyo

zsoelim

Команда tail позволяет наблюдать, как изменяется содержимое файла в режиме реального времени. Эту ее особенность удобно использовать для наблюдения за появлением новых записей в файлах журналов. В следующем примере демонстрируется наблюдение за файлом messages в каталоге /var/log. В некоторых дистрибутивах Linux для этого требуется обладать привилегиями суперпользователя, поскольку файл /var/log/messages может содержать секретную информацию.

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