Шрифт:
>
Больше
>=
Больше или равно
~
Соответствие регулярному выражению (фрагмент строки совпадает с шаблоном)
! ~
Несоответствие регулярному выражению (в строке не обнаружено совпадений с шаблоном)
Проверка на совпадение
Оператор ~ (тильда) позволяет находить поля, соответствующие заданному шаблону (регулярному выражению). Обычно он применяется в конструкции 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
Проверка "меньше или равно"