awk обеспечивает более мощные
шаблоны для поиска строки символов,
чем сравнение. Такие шаблоны
называются регулярными
выражениями. Простейшим регулярным
выражением является строка
символов, обрамленная знаками
"/". Например:
/Asia/
Эта программа печатает все
записи, которые содержат подстроку
Asia (запись, содержащая Asia как часть
длинной строки, подобной Asian или
Pan-Asiatic, также печатается).
Чтобы ограничить поиск только для
специального поля, вы можете
использовать операторы ~(входит) и
!~(не входит). Программа:
$4 ~ /Asia/ { print $1 }
печатает первое поле всех тех
строк, в которых четвертое поле - Asia,
в то время как программа:
$4 !~ /Asia/ { print $1 }
печатает первое поле всех тех
строк, в которых четвертое поле - не
Asia.
В регулярном выражении могут
использоваться метасимволы:
\, ^, $, ., [, ], *, ?, (, ), |
которые подобны метасимволам,
используемым в shell. Например,
метасимволы "^" и "$"
осуществляют поиск соответственно
начала и конца строки, а метасимвол
"." ищет одиночный символ.
Например:
/^.$/
просматривает все записи для
поиска записи, состоящей из одного
символа.
Если группа символов заключена в
квадратные скобки, то это означает
поиск одного символа из этой
группы. Например, /[ABC]/ -
осуществляет поиск либо символа
"A", либо "B", либо "C".
Границы букв или цифр могут быть
обозначены внутри квадратных
скобок:
/[a-zA-Z]/
Если первым символом после
"[" является символ "^", то
это означает: любой символ, не
входящий в набор. Например:
/[^a-zA-Z]/
означает поиск любого символа,
кроме буквы.
Символ "+" означает "один
или больше". Например, программа:
$2 !~ /^[0-9]+$/
печатает все записи, в которых
второе поле не является строкой из
одной или более цифр. (^ - начало
строки, [0-9]+ - одна или более цифр, $
-конец строки).
Круглые скобки используются для
группирования символов, а символ |
для указания альтернативы.
Программа:
/(apple|cherry) (pie|tart)/
осуществляет поиск строк,
содержащих одну из 4-х подстрок:
apple pie
apple tart
cherry pie
cherry tart
Чтобы отменить специальное
значение метасимвола, поставьте
знак "\" перед ним. Например:
/b\$/
печатает все строки, содержащие
символ "b" и следующий за ним
знак "$".
В дополнение к распознаваемым
метасимволам, awk распознает
следующие последовательности
языка программирования Си внутри
регулярных выражений и строк:
\b - возврат
\f - перевод формата
\n - новая строка
\r - возврат каретки
\t - табуляция
\ddd - восьмиричное значение
\" - кавычки
\c - с
Например, чтобы напечатать все
строки, содержащие табуляцию,
воспользуйтесь программой:
/\t/
awk интерпретирует любую строку
или переменную справа от символа
"~" или "!~" как регулярное
выражение. Например, мы можем
записать программу:
$2 !~ /^[0-9]+$/
как
BEGIN { digits = "^[0-9]+&" }
$2 !~ digits
Предположим, что нужно найти
строку символов, подобную ^[0-9]+$.
Если строка "^[0-9]+$"
используется как регулярное
выражение, появляются
дополнительные знаки "\",
которые защищают регулярное
выражение. Это связано с тем, что
первый уровень знаков "\"
удаляется при синтаксическом
анализе строки. Первый уровень
"\" перед символом возвращает
его специальное значение в
регулярном выражении, второй нужен,
чтобы защитить его в строке.
Например, нужно найти строки,
содержащие "b" и следующий за
ним знак "$". Регулярное
выражение для этого шаблона:
b\$
Чтобы создать строку для
представления этого регулярного
выражения, необходимо добавить еще
один символ "\":
"b\\$"
Следующие регулярные выражения
попарно эквивалентны:
x ~ "b\\$" x ~ /b\$/
x ~ "b\$" x ~ /b$/
x ~ "b$" x ~ /b$/
x ~ "\\t" x ~ /\t/
Регулярные выражения и подстроки,
поиск которых они осуществляют,
приведены в табл. 22.
Унарные операции *, +, ? имеют
наивысший приоритет, затем
конкатенация и затем
альтернативный выбор |.
Таблица 22
Регулярные выражения
Выражение |
Действие |
с |
Любой, отличный от
"с" мета-символ |
\с |
Символ "с" |
^ |
Начало строки |
$ |
Конец строки |
. |
Любой символ, кроме
новой строки |
[s] |
Любой символ из
набора "s" |
[^s] |
Любой символ, не
входящий в набор "s" |
r* |
Ноль или больше |
r+ |
Один или больше |
r? |
Ноль или один |
(r) |
r |
r1r2 |
Соединить r1 и r2 |
r1|r2 |
r1 или r2 |
|