Шрифт:
Давайте смоделируем ситуацию, при которой возникает синтаксическая ошибка, например, пропустим двойную кавычку в предыдущей команде:
$ 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
Оператор
Проверка
<
Меньше
<=
Меньше или равно
==
Равно
! =
Не равно