Linux и UNIX: программирование в shell. Руководство разработчика
Шрифт:
В результате получим "ААВ".
В следующем шаблоне задано, что буква 'А' встречается не менее четырех раз подряд:
А\{4,\)В
Возможные результаты поиска — "ААААВ" или "АААААААВ", но не "АААВ". Поиск последовательности, в которой буква 'А' встречается от двух до четырех раз, выполняется по такому шаблону:
А\{2,4\}В
Будут найдены строки "ААВ", "АААВ", "ААААВ", но не "АВ" или "АААААВ". Вернемся к уже рассматривавшемуся примеру фильтрации текстового файла, фрагмент которого представлен ниже:
1234ХС9088 4523XX90D1 0011ХА9912 9931ХС3445
Допустим, требуется найти строки, в которых первые четыре
[0-9]\{4\}ХХ[0-9]\(4\}
Применив этот шаблон к приведенному выше фрагменту, получим:
1234ХС9088 - не соответствует
4523XX900i - соответствует
0Q11XA9912 - не соответствует
9931ХС3445 - не соответствует
7.8. Примеры
В табл. 7.2 приведен ряд дополнительных примеров использования регулярных выражений.
Таблица 7.2. Полезные регулярные выражения
^the
Соответствует строкам, которые начинаются символами "the"
[Ss]igna[lL]
Соответствует словам "signal", "signaL", "Signal" и "SignaL"
[Ss]igna[lL]\.
То же, что и в предыдущем случае, но слово, к тому же, должно завершаться точкой
tty$
Соответствует строкам, которые завершаются символами "tty"
^USER$
Соответствует слову "USER", которое является единственным в строке
\.
Соответствует точке
^d..x..x..x
Соответствует каталогам с установленным правом на выполнение для владельца, группы и других пользователей
^[^l]
Исключает из списка файлов записи, соответствующие символическим ссыпкам
00*
Находит строки, содержащие два или больше нулей подряд
[lL]
Соответствует прописной и строчной букве 'l'
[iInN]
Соответствует прописным и строчным буквам 'i' и 'n'
^S
Соответствует пустой строке
^.*$
Соответствует строке, состоящей из любого числа символов
^……$
Соответствует строке, состоящей из шести символов
[a-zA-Z]
Соответствует любой прописной или строчной букве
[a-z][a-z]*
Соответствует по крайней мере одной строчной букве
[^0-9\$]
При рассмотрении цифры и знаки доллара не учитываются
[^0-9A-Za-z]
При рассмотрении не учитываются буквы и цифры
[123]
Соответствует цифрам 1, 2 и 3
[Dd]evice
Соответствует словам "Device" и "device"
De..ce
Соответствует слову, в котором первые два символа — "De", за ними идут любые два символа, а затем -cимволы "се"
\^q
Соответствует
символам "^q"^.$
Соответствует строке, содержащей только один символ
^\.[0-9][0-9]
Соответствует строке, которая начинается с точки и двух цифр
"Device"
Соответствует слову "Device"
De[Vv]ice\.
Соответствует слову "DeVice" или "Device", после которого стоит точка
[0-9]\{2\}-[0-9]\ {2\}-[0-9]\{4\}
Соответствует шаблону даты в формате dd-mm-yyyy
[0-9]\{3\}\.[0-9]\{3\}\ .[0-9]\{3\}\.[0-9]\{3\}
Соответствует шаблону IP–адреса в формате ппп. ппп. ппп. ппп
7.9. Заключение
Регулярные выражения и методы работы с ними — важный аспект shell–программирования. Знакомство этой с методикой позволит повысить качество создаваемых сценариев, так как во многих случаях три–четыре команды фильтрации текста можно заменить одной командой с регулярным выражением.
В следующих главах мы рассмотрим примеры применения регулярных выражений в программах grep, sed и awk.
ГЛАВА 8
Семейство команд grep
Команда grep (global regular expression print — печать глобальных регулярных выражений) является наиболее известным инструментальным средством в UNIX и Linux. Она выполняет в текстовых файлах или стандартном входном потоке поиск выражений, соответствующих шаблону, с последующим отображением результата на экране. Команда grep может работать как с базовыми, так и с расширенными регулярными выражениями. Существует три разновидности этой команды:
• grep -cтандартный вариант, которому уделено основное внимание в данной главе.
• egrep -pаботает с расширенными регулярными выражениями (не поддерживает только оператор \ { \}).
• fgrep — быстрый вариант команды grep. Вместо поиска выражений, соответствующих шаблону, выполняет поиск фиксированных строк из указанного списка. Пусть вас не вводит в заблуждение слово "быстрый". На самом деле это наиболее медленная из команд семейства grep.
Конечно, хотелось бы, чтобы существовала только одна, универсальная, команда
grep, и с этой ролью, в принципе, справляется GNU–версия grep. К сожалению,
нет единого способа задания аргументов для всех трех разновидностей команды grep,
к тому же скорость их работы заметно различается. В этой главе рассматриваются следующие темы:
• параметры команды grep;
• применение регулярных выражений в команде grep;
• особенности поиска алфавитно–цифровых символов.
В предыдущей главе указывалось, что в данной книге описываются только базовые регулярные выражения. Но мы все же рассмотрим несколько примеров употребления расширенных регулярных выражений во время знакомства с командой egrep. Основное же внимание будет уделено команде grep. Все применяемые в ней шаблоны могут без изменений использоваться и в команде egrep.