Запятая указывает, что предыдущий символ встречается не менее двух раз. Вот как можно найти все записи, содержащие по крайней мере три девятки:
$ 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.
Опция -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
Для поиска в файле пустых строк можно составить шаблон из метасимволов '^' и '$':
$ grep '^$' myfile
Если шаблон поиска включает какой‑либо метасимвол в качестве литерала, т. е. обычного символа, следует поставить перед ним обратную косую черту, чтобы отменить его специальную интерпретацию. Предположим, требуется отыскать все строки, содержащие точку. Эту задачу решает такая команда:
$ grep '\.' myfile
Следующая команда ищет в файле myfile двойные кавычки:
$ grep "\" ' myfile
А вот эта команда отбирает в листинге команды ls -l запись, соответствующую файлу control.conf.
$ ls -l | grep 'control\.conf'
В моей системе применяется следующий формат наименования файлов с документами: до шести символов, расположенных в начале, являются буквами нижнего регистра, далее следует точка, а завершают последовательность два символа верхнего регистра. Если требуется найти имена файлов подобного типа, записанные в файле. filename.deposit, следует применить такую команду:
$ grep '[а–z]\{1,6\}\.[А–Z]\{1,2\}' filename.deposit
yrend. AS - соответствует
mothdf — не соответствует
sca.PP - соответствует
qp.RR - соответствует
Администратору DNS–сервера приходится поддерживать большое количество IP–адресов, относящихся к различным сетям. В моей системе файл ipfile может содержать свыше 200 адресов. Мне часто приходится выполнять поиск всех адресов в формате "nnn.nnn" (т. е. адресов, содержащих две трехзначные последовательности, оканчивающиеся точкой). Для этой дели я пользуюсь следующей командой:
S grep '[0-9]\{3\}\.[0-9]\{3\}\.' ipfile
Предположим, имеется такой файл:
$ 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). Обозначение класса состоит из открывающей квадратной скобки, двоеточия, собственно имени класса, двоеточия и закрывающей квадратной скобки. Поскольку класс представляет собой диапазон, обозначение класса дополнительно должно заключаться в квадратные скобки.
Таблица 8.1. Основные классы символов и эквивалентные им регулярные выражения
Класс | Эквивалентное регулярное выражение |
[:upper:] | [A‑Z] |
[:lower:] | [a‑z] |
[:digit:] | [0-9] |
[:alnum:] | [0-9a‑zA‑Z] |
[:space:] | символы пробела |
[:alpha:] | [a‑zA‑Z] |