Следующая команда находит в файле data.f строки, не начинающиеся с цифры 4 или 8:
$ grep '^[^48]' data.f
219 dec 2СС1999 CAD 23.00 PLV2C 68
216 sept 321Л998 USP 86.00 KVM9E 234
Символ '^' заключенный в квадратные скобки, говорит о том, что шаблон соответствует любому символу, кроме цифр 4 и 8. Символ 'Л' в начале шаблона — это признак того, что поиск производится с начала каждой строки.
8.2.3. Шаблон, соответствующий любому символу
Предположим, в файле data.f требуется найти коды фирм, которые начинаются на букву 'К' и заканчиваются буквой 'D'. Реализуется это следующим образом:
$ grep 'K…D' data.f
47 Oct 3ZL1998 LPSX 43.00 KVM9D 512
483 may 5PA199S USP 37.00 KVW9D 644
Данный шаблон рассчитан на то, что коды фирм в файле состоят из пяти символов.
Ниже представлена небольшая вариация вышеприведенного примера. На этот раз осуществляется поиск всех кодов со следующей структурой: первые два символа — буквы в верхнем регистре, далее следуют два произвольных символа, а завершает последовательность буква 'С':
$ grep '[A‑Z][A‑Z]..C' data.f
483 Sept 5AP1996 USP 65.00 LVX2C 189
219 dec 2CC1999 CAD 23.00 PLV2C 68
484 nov 7PL1996 CAD 49.00 PLV2C 234
8.2.4. Поиск по дате
Представленная ниже команда находит все заказы, которые были сделаны в 1996 или 1998 году и коды которых начинаются с цифры 5:
$ grep '5..199[68]' data.f
483 Sept 5АР1996 USP 65.00 LVX2C 189
483 may 5РА1998 USP 37.00 KVM9D 644
Структура используемого здесь шаблона такова: первым символом является цифра 5, за ней следует два произвольных символа, затем число 199, а последним символом может быть либо цифра 6, либо цифра 8.
Поиск всех заказов, сделанных в 1998 году, выполняется посредством команды:
$ grep '[0-9]\{3\}8' data.f
47 Oct 3ZL1998 LPSX 43.00 KVM9D 512
483 may 5PA1998 USP 37,00 KVM9D 644
216 sept 3ZL1998 USP 86.00 KVM9E 234
Примененный в этом примере шаблон означает: найти любую последовательность из трех цифр, за которой идет цифра 8.
8.2.5. Комбинированные диапазоны
Допустим, необходимо найти строки, в которых код города имеет следующий формат: первым символом является произвольная цифра, второй символ выбирается из диапазона от 0 до 5, а третий символ принадлежит диапазону от 0 до 6, Воспользуемся следующей командой:
$ grep ' [0-9][0-5][0-63' data.f
47 Oct 3ZL1998 LPSX 43.00 KVM9D 512
484 nov 7PL1996 CAD 49.00 PLV2C 234
483 may 5PA199B USP 37.00 KVM9D 644
216 sept 3ZL1998 USP 86.00 KVM9E 234
Как видите, отображается больше информации, чем нам необходимо. Значит, в. шаблоне поиска недостаточно уточнен критерий отбора информации. Очевидно, следует указать, что поиск нужно начинать в начале строки. Для этого применим метасимвол'^':
$ grep '^[0-9][0-5][0-6]' data.f
216 sept 3ZL1998 USP 86.00 KVM9E 234
8.2.6. Поиск повторяющихся последовательностей
Если необходимо найти какую‑либо строку, которая содержит цифру 4, повторенную минимум дважды, задайте такую команду:
$ grep '4\{2,\}' data.f
483 may 5PA1998 USP 37.00 KVM9D 644
Запятая указывает, что предыдущий символ встречается не менее двух раз. Вот как можно найти все записи, содержащие по крайней мере три девятки:
$ grep '9\{3,\}' data.f
219 dec 2СС1999 CAD 23.00 PLV2C 68
Иногда точное число повторений символа не известно. В таких случаях окажется полезной команда со следующей структурой:
$ grep '8\{2,6\}3' myfile
83 — не соответствует
888883 -cоответствует
8884 — не соответствует
88883 -cоответствует
Здесь задан поиск строк, в которых цифра 8 встречается от двух до шести раз подряд и предшествует цифре 3.
8.2.7. Выбор из нескольких шаблонов
Опция -e позволяет использовать в команде grep синтаксис расширенных регулярных выражений. Предположим, необходимо найти все заказы с кодами городов 216 или 219. В этом случае можно воспользоваться метасимволом 'Г, задающим выбор из двух шаблонов:
$ grep -E '219|216' data.f
219 dec 2СС1999 CAD 23.00 PLV2C 68
216 sept 3ZL1998 USP 86.00 KVM9E 234
8.2.8. Поиск пустых строк
Для поиска в файле пустых строк можно составить шаблон из метасимволов '^' и '$':
$ grep '^$' myfile
8.2.9. Поиск специальных символов
Если шаблон поиска включает какой‑либо метасимвол в качестве литерала, т. е. обычного символа, следует поставить перед ним обратную косую черту, чтобы отменить его специальную интерпретацию. Предположим, требуется отыскать все строки, содержащие точку. Эту задачу решает такая команда:
$ grep '\.' myfile
Следующая команда ищет в файле myfile двойные кавычки:
$ grep "\" ' myfile
А вот эта команда отбирает в листинге команды ls -l запись, соответствующую файлу control.conf.
$ ls -l | grep 'control\.conf'
8.2.10. Поиск имен файлов, соответствующих заданному формату
В моей системе применяется следующий формат наименования файлов с документами: до шести символов, расположенных в начале, являются буквами нижнего регистра, далее следует точка, а завершают последовательность два символа верхнего регистра. Если требуется найти имена файлов подобного типа, записанные в файле. filename.deposit, следует применить такую команду:
$ grep '[а–z]\{1,6\}\.[А–Z]\{1,2\}' filename.deposit
yrend. AS - соответствует
mothdf — не соответствует
sca.PP - соответствует
qp.RR - соответствует
8.2.11. Поиск IP–адресов
Администратору DNS–сервера приходится поддерживать большое количество IP–адресов, относящихся к различным сетям. В моей системе файл ipfile может содержать свыше 200 адресов. Мне часто приходится выполнять поиск всех адресов в формате "nnn.nnn" (т. е. адресов, содержащих две трехзначные последовательности, оканчивающиеся точкой). Для этой дели я пользуюсь следующей командой:
S grep '[0-9]\{3\}\.[0-9]\{3\}\.' ipfile
8.2.12. Поиск строк с использованием подстановочных знаков
Предположим, имеется такой файл:
$ cat testfile
looks likes looker long
Следующая команда находит в нем слова, начинающаяся с буквы 'l', после которой идет произвольное число символов, а за ними — буква 's':
$ grep 'l.*s' testfile
looks likes
Показанная ниже команда отбирает слова, начинающиеся с буквы 'l', после которой идет произвольное число символов, затем — буква 'к', а после нее — еще один символ:
$ grep 'l.*k.' testfile
looks likes
Следующая команда находит слова, в которых буква о' встречается не менее двух раз подряд:
$ grep 'ооо*' testfile
looks
Если требуется найти слово, которое стоит в конце строки, воспользуйтесь командой следующего вида:
$ grep 'device$' *
Эта команда ищет во всех файлах текущего каталога строки, завершающиеся словом "device".
8.3. Классы символов
Команда grep поддерживает целый ряд предопределенных диапазонов символов, называемых классами (табл. 8.1). Обозначение класса состоит из открывающей квадратной скобки, двоеточия, собственно имени класса, двоеточия и закрывающей квадратной скобки. Поскольку класс представляет собой диапазон, обозначение класса дополнительно должно заключаться в квадратные скобки.