Командная строка Linux. Полное руководство - [22]
Это очень удобно! С помощью этого приема можно со всем комфортом исследовать вывод любой команды, посылающей результаты на стандартный вывод.
Фильтры
Конвейеры часто используются для выполнения сложных операций с данными. Они позволяют объединить вместе несколько команд. Часто команды, используемые таким способом, называют фильтрами. Фильтры принимают ввод, изменяют его определенным образом и выводят результат. Первый из таких фильтров, который мы опробуем, — команда 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 может содержать секретную информацию.