$ awk '{print $0}' grade.txt
M. Tansley
05/99
48311
Green
8
40
44
J. Lulu
06/99
48317
green
9
24
26
S. 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
Отображение отдельных полей всех записей
Предположим, требуется отобразить на экране только имена спортсменов и названия поясов, которыми они обладают. Соответствующие данные хранятся в полях $1 и $4, поэтому введем такую команду:
$ awk '{print $1, $4}' grade.txt
M. Tansley Green
J. Lulu green S. Bunny Yellow J. Troll Brown-3
L. Tansley Brown-2
Отображение заголовка отчета
Результат работы предыдущей команды выглядит не слишком привлекательно. Рассмотрим, какие шаги можно предпринять, чтобы улучшить его. Прежде всего выровняем границы полей посредством символов табуляции. Табуляция создается с помощью Escape–последовательности \t (об управляющих последовательностях речь пойдет ниже). Кроме того, для придания отчету солидности добавим к нему заголовок, включающий названия полей, а также разделительную линию, которая отображается
в отдельной строке благодаря Escape–последовательности \n.: Заголовок отчета формируется в процедурной части шаблона begin.
$ awk 'BEGIN {print "Name Belt\n -"} \
{print $1 " \t" $4}' grade.txt
Name
Belt
M. Tansley
Green
J. Lulu
green
P. Bunny
Yellow
J. Troll
Brown-3
L. Tansley
Brown-3
Отображение резюме отчета
Чтобы добавить в конец отчета строку "end‑of‑report", следует воспользоваться шаблоном end. Этот шаблон употребляется для обозначения действий, которые выполняются после обработки последней записи входного файла.
$ awk 'BEGIN {print "Name\n "} {print $1} \
END {print "\nend‑of‑report"}' grade.txt
Name
M. Tansley
J. Lulu
P. Bunny , .
J. Troll L. Tansley
end‑of‑report
Обработка сообщений об ошибках
При работе с утилитой awk почти невозможно избежать синтаксических ошибок. Эта утилита выводит на экран искомую строку и указывает, в каком ее месте возникла ошибка. Но сами сообщения об ошибках не слишком информативны и не всегда могут помочь в разрешении проблем.
Давайте смоделируем ситуацию, при которой возникает синтаксическая ошибка, например, пропустим двойную кавычку в предыдущей команде:
$ awk 'BEGIN {print "Name\n "} {print $1} \
END {print "\nend‑of‑report}' grade.txt
awk: cmd. line:2: END {print "\nend‑of‑report}
awk: end. line:2: ^ unterminated string
Если вы впервые сталкиваетесь с утилитой awk, краткость подобных сообщений может вас смутить. Предлагаем вам перечень правил обнаружения ошибок:
• убедитесь, что сценарий awk целиком заключен в одинарные кавычки;
• удостоверьтесь, что все кавычки внутри сценария являются парными;
• проверьте, заключены ли процедуры в фигурные скобки, а условные конструкции - в круглые скобки.
Более понятным является сообщение об ошибке, возникающей при создании ссылки на несуществующий файл:
$ awk 'END {print "End‑of‑report"}' grades.txt
awk: cmd. line":2: fatal: cannot open file 'grades.txt' for reading (No such file or directory)
Ввод данных с клавиатуры
Давайте посмотрим, что произойдет, если не указать файл grade.txt в командной строке:
$ awk 'BEGIN {print "Name Belt\n "} \
{print $1" \t"$4}'
Name Belt
>
С помощью шаблона begin на экран выводится заголовок отчета, при этом сам отчет пуст, а утилита awk ожидает получения входных данных с клавиатуры (об этом свидетельствует строка приглашения >). Вы должны ввести их вручную. После нажатия клавиши [Enter] введенная строка интерпретируется как входная запись и по отношению к ней выполняются соответствующие инструкции. По завершении ввода данных нажмите [Ctrl+D]. Подобный метод работы применяется довольно редко, поскольку чреват большим количеством опечаток и ошибок.
9.2.3. Регулярные выражения
При изучении возможностей команды grep приводилось большое количество примеров регулярных выражений, поэтому мы не будем еще раз останавливаться не описании их синтаксиса. Ниже, когда будут рассматриваться операторы, вы встретите много примеров команд awk с регулярными выражениями.
В сценарии awk регулярное выражение выделяется с обеих сторон символами косой черты: /регулярное_выражение/. Например, если в текстовом файле нужно найти строку, содержащую слово "Green", следует задать шаблон /Green/.
9.2.4. Метасимволы
Перечисленные ниже метасимволы могут встречаться в регулярных выражениях утилиты awk:
\ ^ $ . [ ] | ( ) * + ?
Следует остановиться на описании двух метасимволов, которые не рассматривались в главе 7, поскольку они специфичны для awk и не применяются в команде grep и редакторе sed.
+ Указывает на то, что предыдущий символ встречается один или несколько раз. Например, выражение /t+/ соответствует одной или нескольким буквам 't', а выражение /[а–z]+/ — любой последовательности строчных букв.
? Указывает на то, что предыдущий символ встречается не более одного раза. Например, выражение /xy?z/ соответствует строкам "XYZ" и "XZ".
9.2.5. Операторы
В awk существует достаточно много операторов, манипулирующих числами, строками, переменными, полями и элементами массива. Ниже приведен список основных операторов.
=, += *= /= %=
Операторы присваивания (простого и составного)
? ;
Условный оператор
|| && !
Логические операторы ИЛИ, И, НЕ
~ !~
Операторы сравнения с регулярным выражением (совпадение, несовпадение(
< <= == != > >=
Операторы простого сравнения
+ - * / %
Арифметические операторы (сложение, вычитание, умножение, деление, деление по модулю)
++ --
Инкремент и декремент (могут быть префиксными и пост-
9.2.6. Операторы сравнения
Простейшие инструкции awk создаются с помощью операторов сравнения, перечисленных в табл. 9.2.
Таблица 9.2. Операторы сравнения утилиты awk
Оператор
Проверка
<
Меньше
<=
Меньше или равно
==
Равно
! =
Не равно
>
Больше
>=
Больше или равно