1 авг. 2008 г.

grep: Поиск строк в файлах

Ни имя команды, ни ее аббревиатура (“General Regular Expression Parser” - синтаксический анализатор общих регулярных выражений) не слишком интуитивны, но ее действие и ее использование довольно просты для понимания: grep выполняет поиск в одном или нескольких файлах по шаблону, заданному в качестве аргумента. Ее синтаксис:
grep [опции] <шаблон> [один или более файлов]
Если указано несколько файлов, в отображаемом результате их имена будут выводиться перед каждой найденной строкой. Для предотвращения вывода этих имен используйте опцию -h; используйте опцию -l для вывода только имен файлов с найденными совпадениями. Шаблон - это регулярное выражение, хотя в большинстве случаев он состоит просто из одного слова. Наиболее часто используемые опции:
  • -i: поиск без учета регистра (т.е. игнорирование разницы между верхним и нижним регистром);
  • -v: обратный поиск. Вывод строк, которые не соответствуют шаблону;
  • -n: вывод номера строки для каждой из найденных строк;
  • -w: сообщает grep'у, что шаблон должен совпадать со всем словом.

Итак, давайте теперь вернемся к анализу лог-файла почтового демона. Нам необходимо найти все строки в файле /var/log/mail/info, содержащие шаблон “postfix”. Для этого мы вводим такую команду:

# grep postfix /var/log/mail/info
Команда grep может быть использована в канале. Так мы можем получить такой же результат, что и в предыдущем примере, при помощи следующего:

# cat /var/log/mail/info | grep postfix 
Если нам нужно найти все строки, не содержащие шаблона “postfix”, нам надо будет воспользоваться опцией -v:

# grep -v postfix /var/log/mail/info
Давайте предположим, что нам необходимо найти все сообщения об успешно отправленных письмах. В этом случае мы должны отфильтровать все строки, добавленные почтовым демоном в файл журнала (содержащие шаблон “postfix”), и они должны содержать сообщение об успешной отправке (“status=sent”):

# grep postfix /var/log/mail/info |grep status=sent
В этом случае команда grep использована дважды. Это разрешается, но не совсем красиво. Мы можем получить тот же результат при помощи утилиты fgrep. Сначала нам нужно создать файл, содержащий шаблоны, записанные в столбик. Такой файл может быть создан следующим образом (мы используем patterns.txt в качестве имени файла):

# echo -e 'status=sent\npostfix' >./patterns.txt
Затем мы вызываем следующую команду, в которой мы используем файл patterns.txt со списком шаблонов и утилиту fgrep вместо “двойного вызова” команды grep:

# fgrep -f ./patterns.txt /var/log/mail/info
Файл ./patterns.txt может содержать сколько угодно шаблонов. Каждый из них должен быть введен в виде одной строки. Например, для выборки сообщений о письмах, успешно отправленных на адрес peter@mandrakesoft.com, достаточно будет добавить адрес этого электронного ящика в наш файл ./patterns.txt, выполнив следующую команду:

# echo 'peter@mandrakesoft.com' >>./patterns.txt
Понятное дело, что вы можете комбиноровать команду grep с tail и head. Если нам нужно найти сообщения о предпоследнем электроном письме, отправленном на адрес peter@mandrakesoft.com, мы используем:

# fgrep -f ./patterns.txt /var/log/mail/info | tail -n2 | head -n1
Здесь мы применили описанный выше фильтр и отправили результат через канал в команды tail и head. Они выбрали из данных предпоследнее значение.

wc: Подсчёт элементов в файлах

Команда wc (Word Count - подсчёт слов) используется для подсчёта числа строк и слов в файлах. Она также полезна для подсчёта байтов, символов и длины самой длинной строки. Её синтаксис:

wc [опции] [файл(ы)]
Список полезных опций:
  • -l: вывод количества новых строк;
  • -w: вывод количества слов;
  • -m: вывод общего количества символов;
  • -c: вывод количества байт;
  • -L: вывод длины самой длинной строки в заданном тексте.
По умолчанию команда wc выводит количество новых строк, слов и символов. Вот несколько примеров использования:
Если нам нужно определить число пользователей в нашей системе, мы можем ввести:

$wc -l /etc/passwd 
Если нам нужно узнать число CPU в нашей системе, мы пишем:

$grep "model name" /proc/cpuinfo |wc -l
В предыдущем разделе мы получили список сообщений об успешно отправленных письмах на адреса, перечисленные в нашем файле./patterns.txt. Если нам нужно узнать количество таких сообщений, мы можем перенаправить наш отфильтрованный результат через канал в команду wc:

# fgrep -f ./patterns.txt /var/log/mail/info | wc -l

Комментариев нет: