<< Предыдущий раздел | /\ Содержание | >> Следующий раздел

Команда-фильтр grep: поиск строки по файлам

Часто возникает задача: надо найти, в каком файле встречается некое слово или фраза. Для этого служит команда "grep". Она ищет "образец" в указанных файлах (или в стандартном вводе, если файлы не указаны) и печатает все строки, на которых он встречается. Пример (найти строку "no"):

bobby:~% grep no *                              
proverbs:Dead men tell no tales.
bobby:~% _

Каждая строка предваряется именем файла, в котором она найдена, и двоеточием; если указан только один файл (или стандартный ввод), то этого не делается -- просто печатается найденная строка.

С ключом "-i" grep ищет, не различая маленькие/заглавные буквы:

bobby:~% grep no *                              
errs:/bin/ls: file10: No such file or directory
errs:/bin/ls: file11: No such file or directory
proverbs:Dead men tell no tales.
bobby:~% _

Вообще-то, образец поиска для grep -- это не просто строка, а так называемое "регулярное выражение", некоторые символы в котором приобретают специальное значение:

Поскольку большинство этих символов имеют специальное значение и для оболочки, то образец следует указывать в одинарных кавычках (прямых апострофах).

Пример (найти все символьные линки в директории /etc):

bobby:~% ls -l /etc | grep  '^l' 
lrwxrwxrwx   1 root     root           21 Dec  9 20:55 initrunlvl -> ../
var/run/initrunlvl
lrwxrwxrwx   1 root     root           38 Dec  9 21:04 localtime -> ../u
sr/share/zoneinfo/Asia/Novosibirsk
lrwxrwxrwx   1 root     root           11 Dec  9 20:44 rmt -> ../sbin/rm
t*
bobby:~% _

Здесь используется то, что для символьных линков ls первым символом строки (тип файла) выводит букву "l".

Если результат grep слишком большой и не помещается на экран, то его можно "переправить" команде просмотра, например, less. Пример (показать список всех поддиректорий из директории /usr/lib):

bobby:~% ls -l /usr/lib | grep '^d' | less                 

Вообще говоря, в конвейере может участвовать сколько угодно команд. Так, команда

bobby:~% ls -l /usr/doc | grep '^d' | grep 'lib' | less    

делает почти то же, что и в предыдущем примере, но отбирает только те директории, в имени которых есть "lib".

Совет
Команда grep -- одна из самых полезных и частоиспользуемых в Unix. Она столь же важна для нахождения файлов с нужным содержимым, как ls -- для нахождения файлов с нужным именем. Поэтому стоит хорошо освоить grep -- умелое владение ей позволяет сэкономить массу времени и сил. Кроме того, регулярные выражения широко используются во многих других программах.


<< Предыдущий раздел | /\ Содержание | >> Следующий раздел