Иллюстрированный самоучитель по Linux

Find, locate, whereis и grep

Grep

Если команда find применяется для поиска файла по имени, типу или дате, то по команде grep происходит поиск заданной строки текста в нескольких файлах.

Предположим, у вас есть текстовый файл, содержащий слово "radio". Вы записали этот файл в исходный каталог, но забыли его имя. Следовательно, надо найти файл, который содержит слово "radio". Именно такой поиск выполняется по команде grep.

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

$ grep radio *
ab.txt:This is a tes.t of searching for the word radio .pop.txt:
On another radio station, he found that

Обратите внимание: команда grep выводит по одной строке на каждое найденное слово "radio". Справа от имени файла после двоеточия приведена строка, содержащая искомое слово. Общий формат команды grep следующий.

$ grep text-pattern file-list

В качестве строки поиска text-pattern можно указать слово, фразу или более сложное регулярное выражение. Регулярные выражения – мощное средство поиска текста. Их описание можно найти на странице руководства команды grep. Список файлов file-list может быть любой формы, допускаемой оболочкой. Типы выражений, составляющие список файлов, рассмотрены в гл. 16.

Обычно проверка одного файла проводится командой:

$ grep text-pattern file-name

…а проверка всех файлов некоторого каталога командой:

$ grep text-pattern *

В последней команде "*" – это выражение, означающее поиск во всех файлах текущего каталога. Строка поиска в простейшем варианте представляет собой слово или часть слова без пробелов. Если надо найти фразу, например "is a test", от ее указывают в двойных кавычках, как в следующем примере:

$ "grep "is a test"*
ab.txt:This is a test of searching for the word radio.

Подобно командам more и less, команду grep удобно конвейеризировать с другими командами. Предположим, что нам необходимо получить список всех файлов в текущем каталоге с датой модификации 12 мая. Для этого можно воспользоваться командой 1s – | с присоединенной командой grep:

$ 1s – 1 | grep "May 12"
-rw-r-r – 1 root root 19197 May 12 21:17 rfbprotoheader.pdf
-rw-r-r – 1 root root 110778 May 12 21:20 rfprotoA.zip
-rw-r-r – 1 root root 17692 May 12 23:03 svnc-0.1 .tar,gz
-rw-r-r – l root root 25222 May 12 19:58 vnc-3. 3 .l_j-avasrc .tgz
drwxr-xr-x 2 root root 1024 May 12 21:49 vncj.ava

Команды и кавычки

Существует три разновидности кавычек, используемых в командах: одиночная ('), двойная (") и обратная ('), Эти кавычки отличаются с точки зрения встроенных команд, наподобие date, и переменных, наподобие $LOGNAME. Пара любых одинаковых кавычек ограничивает передаваемую команде строку данных. Например, допустим, что $LOGNAME=mj и сравним следующие команды:

echo Welcome $LOGUAME, the date is date
echo Welcome $LOGNAME, the date is date'
echo "Welcome $LOGNAME, the date is date"
echo "Welcome $LOGNAME, the date is 'date'"

В зависимости от того, насколько корректно указаны кавычки, Linux будет (или не будет) выполнять команду date или транслировать $LOGNAME. Результаты выглядят так:

Welcome mj, the date is date
Welcome $LGGNAME, the date is /Sate
Welcome mj, the date is date
Welcome mj, the.date is Mon June 14 10:45:20 EDT 2001

Первый пример не содержит кавычек вообще. $LOGNAME транслируется как mj, но команда date не выполняется. Во втором примере использованы одиночные кавычки. $LOGNAME не транслируется, а команда date не выполняется. Третий пример содержит двойные кавычки. Результат совпадает с результатом первой команды, поэтому двойные кавычки полезны в таких командах как grep. Последний пример заключает date в обратные кавычки. Такая процедура позволяет выполнить команду Linux, входящую в состав текстовой строки.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.