Литмир - Электронная Библиотека

$ 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

Оператор

Проверка

<

Меньше

<=

Меньше или равно

==

Равно

! =

Не равно

>

Больше

>=

Больше или равно

26
{"b":"273485","o":1}