~
Соответствие регулярному выражению (фрагмент строки совпадает с шаблоном)
! ~
Несоответствие регулярному выражению (в строке не обнаружено совпадений с шаблоном)
Проверка на совпадение
Оператор ~ (тильда) позволяет находить поля, соответствующие заданному шаблону (регулярному выражению). Обычно он применяется в конструкции if, условная часть которой заключается в круглые скобки.
Предположим, из файла grade.txt требуется извлечь информацию о владельцах коричневых поясов. Для этого нужно найти строки, содержащие слово "Brown" (коричневый):
$ awk '{if($3 ~ /Brown/) print $0}' grade.txt
J. Troll
07/99
4842
Brown-3
12
26
26
L. Tansley
05/99
4712
Brown-2
12
30
28
Конструкция if является частью сценария awk и помещается в фигурные скобки. Поставленную задачу можно решить намного проще, если вспомнить, что при нахождении строки, соответствующей шаблонной части инструкции, утилита awk по умолчанию отображает всю строку. Таким образом, можно вообще не указывать команду print, а условную часть конструкции if представить в виде шаблона:
$ awk '$0 ~ /Brown/' grade.txt
J. Troll
07/99
4842
Brown-3
12
26
26
L. Tansley
05/99
4712
Brown-2
12
30
28
Приведенная команда означает следующее: если в строке встречается слово "Brown", вывести ее на экран.
Проверка на равенство
Допустим, необходимо получить информацию об ученике с номером 48. Показанная ниже команда не позволит решить данную задачу, поскольку в файле есть множество номеров, содержащих последовательность цифр "48":
$ awk '{if($3 ~ /48/) print $0}' grade.txt
М. Tansley
05/99
"48311
Green
8
40
44
J. Lulu
06/99
48317
green
9
24
26
P. Bunny
02/99
48
Yellow
12
35
28
J. Troll
07/99
4842
Brown-3
12
26
26
Чтобы найти точное совпадение, воспользуйтесь оператором ==:
$ awk '$3 == "48"' grade.txt
P. Bunny 02/99 48 Yellow 12 35 28
Проверки на несовпадение и неравенство
Иногда требуется извлечь те строки, которые не соответствуют шаблону. Для этих целей предназначен оператор !~, выполняющий проверку на неравенство регулярному выражению. Давайте, например, выведем список всех учеников, не являющихся обладателями коричневого пояса:
$ awk '$0 !~ /Brown/' grade.txt
M. Tansley
05/99
48311
Green
8
40
44
J. Lulu
06/99
48317
green
9
24
26
P. Bunny
02/99
48
Yellow
12
35
28
He забывайте, что по умолчанию утилита awk выводит на экран все записи, отвечающие указанному критерию отбора, поэтому нет необходимости задавать какое‑либо действие. Если вместо предыдущей команды указать
$ awk '$4 != "Brown"' grade.txt
получим ошибочный результат. Эта команда означает, что требуется найти строки, в которых четвертое поле не равно "Brown". Такому критерию удовлетворяют все строки в файле. Конечно, если нужно найти обладателей поясов, отличных от "Brown-2", можно применить следующую команду:
$ awk '$4 != "Brown-2"' grade.txt
M. Tansley
05/99
48311
Green
8
40
44
J. Lulu
06/99
48317
green
9
24
26
P. Bunny
02/99
48
Yellow
12
35
28
S. Trnll
07/99
4842
Brown-3
12
26
26
Обратите внимание на один важный момент: строка "Brown-2" заключена в двойные кавычки. Если этого не сделать, четвертое поле будет сравниваться с содержимым переменной Brown-2. Вряд ли в вашем интерпретаторе существует такая переменная, поэтому вместо нее будет подставлена пустая строга, и вы получите совершенно другой результат.
Проверка "меньше чем"
Допустим, нужно определить, кто из учеников не смог набрать максимального количества очков на соревновании. Для выполнения проверки достаточно сравнить набранный рейтинг (поле 6) с общей суммой возможных очков (поле 7). Также поместим в отчет небольшое сообщение.
$ awk '{if($6 < $7) print $1 " — try better at the next competition"}' grade.txt
M. Tansley — try better at the next competition J. Lulu — try better at the next competition
Проверка "меньше или равно"
Чтобы включить в отчет тех учеников, рейтинг которых не выше значения в седьмом поле, нужно лишь незначительно видоизменить предыдущий пример:
$ awk '{if($6 <= $7) print $1}' grade.txt
M. Tansley
J. Lulu J. Troll
Проверка "больше чем"
Следующая команда формирует список лидеров соревнования:
$ awk '{if ($6 > $7) print $1}' grade.txt
L. Tansley P. Bunny
9.2.7. Логические операторы
Логические операторы позволяют формировать сложные выражения, позволяющие выполнять проверку нескольких условий. Существует три логических оператора:
&& И: чтобы результат был истинным, оба операнда должны быть истинными | | ИЛИ: чтобы результат был истинным, хотя бы один из операндов должен
быть истинным! НЕ: результат проверки инвертируется
Оператор логического И
Предположим, перед нами поставлена задача выяснить, кому был присвоен зеленый пояс в мае 1999 года. Строки, отвечающие этому условию, должны в первом поле содержать значение "05/99", а во втором — "Green":
$ awk '{if($2 == "05/99" && $4 == "Green") print $0}' grade.txt
M. Tansley 05/99 48311 Green 8 40 44
Оператор логического ИЛИ
Чтобы получить список учеников, обладающих желтым или коричневым поясом, воспользуйтесь оператором | |:
$ awk '{if ($4 == "Yellow" ) || $4 ~ /Brown/} print $0}' grade.txt
P. Bunny
02/99
48
Yellow
12
35
28
J. Troll
07/99
4842
Brown-3
12
26
26
L. Tansley
05/99
4712
Brown-2
, 12
30
28
Приведенную команду можно упростить с помощью метасимвола, означающего выбор любого из двух шаблонов:
$ awk '$4 ~ /Yellow|Brown/' grade.txt
P. Bunny
02/99
48
Yellow
12
35
28
J. Troll
07/99
4842
Brown-3
12
26
26
L. Tansley
05/99
4712
Brown-2
12
30
28
9.2.8. Операторы присваивания и арифметические операторы
С помощью операторов присваивания и арифметических операторов можно создавать в сценариях awk локальные переменные и манипулировать их значениями.