Команда
grep
принимает опции, шаблон соответствия и файлы для поиска:
<b>grep</b> [<i>опции</i>]<i> шаблон</i> [<i>файлы</i>]
Если имена файлов не заданы, команда анализирует стандартный ввод.
Давайте начнем с изучения основных опций команды
grep
. И на этот раз в табл. 2.14 приведены только самые важные из них; полный список см. на страницах интерактивного справочного руководства.
Таблица 2.14
| Опция | Описание |
-с
| Вместо вывода на экран совпавших с шаблоном строк выводит их количество |
-E
| Включает расширенные регулярные выражения |
-h
| Ужимает обычное начало каждой строки вывода за счет удаления имени файла, в котором строка найдена |
-i
| Не учитывает регистр букв |
-l
| Перечисляет имена файлов со строками, совпадающими с шаблоном; не выводит сами найденные строки |
-v
| Меняет шаблон соответствия для выбора вместо строк, соответствующих шаблону, несовпадающих с ним строк |
Выполните упражнение 2.17.
Упражнение 2.17. Основной вариант использования команды
grep
Посмотрим команду
grep
в действии на примерах простых шаблонов.
$ <b>grep in words.txt</b>
When shall we three meet again. In thunder, lightning, or in rain?
I come, Graymalkin!
$ <b>grep -c in words.txt words2.txt</b>
words.txt:2 words2.txt:14
$ <b>grep -c -v in words.txt words2.txt</b>
words.txt:9
words2.txt:16$
Как это работает
В первом примере нет опций; в нем просто ищется строка
in
в файле words.txt и выводятся на экран любые строки, соответствующие условию поиска. Имя файла не отображается, поскольку поиск велся в единственном файле.
Во втором примере в двух разных файлах подсчитывается количество строк, соответствующих шаблону. В этом случае имена файлов выводятся на экран.
В заключение применяется опция
-v
для инвертирования критерия поиска и подсчета строк, не совпадающих с шаблоном.
Регулярные выражения
Как вы убедились, основной вариант применения команды grep легко усвоить. Теперь пришло время рассмотреть основы построения регулярных выражений, которые позволят вам выполнять более сложный поиск. Как упоминалось ранее в этой главе, регулярные выражения применяются в системе Linux и многих языках программирования с открытым исходным кодом. Вы можете использовать их в редакторе vi и в скриптах на языке Perl, применяя одни и те же принципы, общие для регулярных выражений, где бы они ни появлялись.
При обработке регулярных выражений определенные символы интерпретируются особым образом. В табл. 2.15 приведены наиболее часто используемые в регулярных выражениях символы.
Таблица 2.15
| Символ | Описание |
^
| Привязка к началу строки |
$
| Привязка к концу строки |
.
| Любой одиночный символ |
[]
| В квадратных скобках содержится диапазон символов, с любым из них возможно совпадение, например, диапазон символов a-e или инвертированный диапазон, перед которым стоит символ ^
|
Если вы хотите использовать любые из перечисленных символов как "обычные", поставьте перед ними символ
. Например, если нужно найти символ
$
, просто введите
$
.
Есть также несколько полезных специальных проверочных шаблонов, которые могут указываться в квадратных скобках (табл. 2.16).
Таблица 2.16
| Проверочный шаблон | Описание |
[:alnum:]
| Буквенно-цифровые символы |
[:alpha:]
| Буквы |
[:ascii:]
| Символы таблицы ASCII |
[:blank:]
| Пробел или табуляция |
[:cntrl:]
| Управляющие символы ASCII |
[:digit:]
| Цифры |
[:graph:]
| Неуправляющие и непробельные символы |
[:lower:]
| Строчные буквы |
[:print:]
| Печатные символы |
[:punct:]
| Знаки пунктуации |
[:space:]
| Пробельные символы, включая вертикальную табуляцию |
[:upper:]
| Прописные буквы |
[:xdigit:]
| Шестнадцатиричные цифры |
Кроме того, если задана опция
=E
для расширенного соответствия, за регулярным выражением могут следовать и другие символы, управляющие выполнением проверки на соответствие шаблону (табл. 2.17). В команде
grep
перед этими символами необходимо вводить символ
.
Таблица 2.17
| Опция | Описание |
?
| Совпадение не обязательно, но возможно не более одного раза |
*
| Совпадения может не быть, оно может быть однократным или многократным |
+
| Совпадение должно быть однократным или многократным |
{<i>n</i>}
| Совпадение должно быть <i>n</i> раз |
{<i>n</i>, }
| Совпадение должно быть <i>n</i> раз и больше |
{<i>n</i>, <i>m</i>}
| Совпадение должно быть от <i>n</i> до <i>m</i> раз включительно |