Регулярные выражения
Кроме возможностей, проиллюстрированных в предыдущем разделе, в awk'е есть и более мощное средство спецификации шаблонов - регулярные выражения. Простейшим регулярным выражением является буквальное указание требуемой цепочки. Пример (регулярные выражения обрамляются символами /):
/Asia/
Данное регулярное выражение - законченная awk-программа, печатающая все строки, содержащие какое-либо вхождение цепочки Asia. Если строка содержит более длинное слово, частью которого является цепочка Asia, например Asiatic, она все равно печатается (в файле countries, однако, таких слов нет).
Используемые в awk'е регулярные выражения трактуются так же, как в распознавателе шаблонов egrep(1). Ряд символов имеет специальный смысл.
Например, чтобы напечатать все строки, начинающиеся с A, следу- ет указать регулярное выражение
/^A/
Для печати всех строк, начинающихся с A, B или C, годится регулярное выражение
/^[ABC]/
Все строки, оканчивающиеся цепочкой ia, распечатываются с помощью шаблона
/ia$/
В общем случае, символ ^ обозначает начало строки, символ $ - конец строки, а символы, заключенные в квадратные скобки, [], сопоставляются с любым одиночным символом из перечисленных в скобках. Кроме того, awk позволяет использовать круглые скобки для группировки, а символ | - для перечисления альтернатив. Знак + определяет, что предшествовавшее ему выражение должно сопоставляться один или более раз, знак ? обозначает повторение нуль или один раз. Программа
/x|y/ { print }
печатает все цепочки, содержащие x или y, программа
/ax+b/ { print }
выводит все цепочки, содержащие символ a, за которым следует один или более символов x, а затем b (например, axb, Paxxxxxxxb, QaxxbR). Программа
/ax?b/ { print }
печатает все цепочки, содержащие символ a, за которым следует необязательный x, а затем символ b (например, ab, axb, yaxbPPPP, CabD).
Два символа, . и *, имеют тот же смысл, что и в ed(1). Более подробно, . обозначает произвольный символ, а * - нуль или более вхождений предыдущего символа. Так, шаблон
/a.b/
сопоставляется с любой записью, содержащей символ a, за которым следует произвольный символ, а затем символ b. Другими словами, запись должна включать символы a и b, разделенные произвольным символом. Например, /a.b/ сопоставляются с axb, aPb и xxxxaXbxx, но не с ab, axxb. Шаблон
/ax*c/
сопоставляется с записью, содержащей символы a и c, разделенные цепочкой из произвольного, возможно нулевого, числа символов x. Например, она сопоставляется с цепочками
ac axc pqraxxxxxxxxxxc901
Так же, как и в ed(1), можно отменить специальную интерпретацию метасимволов (например, ^ и *). Для этого перед такими символами ставится знак \. Например, шаблон
/\/.*\//
сопоставляется с произвольной цепочкой символов, заключенной в "скобки" /.../.
Можно также специфицировать, что некоторое поле (переменная) должно сопоставляться с регулярным выражением (либо не сопоставляться). Это делается при помощи операций ~ и !~. Например, для входного файла countries следующая программа выводит на печать все страны, названия которых заканчиваются цепочкой ia:
Russia Australia India Algeria