С помощью регулярных выражений можно задавать более сложные критерии фильтрации информации. При работе с регулярными выражениями следует заключать шаблон поиска в одинарные кавычки. Это позволит защитить все встречающиеся в нем специальные символы от интерпретатора shell, который в противном случае может "перехватывать" их у команды grep.
В предыдущей главе мы уже отмечали, что с помощью оператора [ 3 можно задать диапазон или список символов, включаемых в шаблон поиска. Предположим, требуется извлечь из файла data.f строка заказов, сделанных в городах, код которых равен 483 или 484. Поставленную задачу решает следующая команда:
$ grep '48[34]' data.f
493 Sept 5AP1996 USP 65.00 LVX2C 189
484 nov 7PL1996 CAD 49.00 PLV2C 234
483 may 5PA1998 asp 37.00 KVM9D 644
Следующая команда находит в файле 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. Символ 'Л' в начале шаблона — это признак того, что поиск производится с начала каждой строки.
Предположим, в файле 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
Представленная ниже команда находит все заказы, которые были сделаны в 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.
Допустим, необходимо найти строки, в которых код города имеет следующий формат: первым символом является произвольная цифра, второй символ выбирается из диапазона от 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
Если необходимо найти какую‑либо строку, которая содержит цифру 4, повторенную минимум дважды, задайте такую команду:
$ grep '4\{2,\}' data.f
483 may 5PA1998 USP 37.00 KVM9D 644