Linux и UNIX: программирование в shell. Руководство разработчика
Шрифт:
Утилита awk анализирует информацию, содержащуюся в одном или нескольких входных файлах.
9.2. Сценарии
Сценарий awk — это набор инструкций, состоящих из шаблонов и связанных с ними процедур. Когда утилита просматривает записи входного файла, она проверяет, установлена ли опция -F или переменная FS (о ней мы поговорим ниже), задающие разделители полей записи. По умолчанию в качестве разделителя принят пробел. При обнаружении символа новой строки прочитанная строка классифицируется
В табл. 9.1 приведен образец входного файла и продемонстрировано, как утилита awk его анализирует. Утилита последовательно просматривает строки файла. Отыскав первый символ–разделитель, она помечает все предыдущие символы как поле номер L Символы между первым и вторым разделителями обозначаются как поле номер 2 и т. д. Процесс анализа завершается при обнаружении символа новой строки, который по умолчанию считается признаком конца записи. После этого содержимое полей сбрасывается и утилита переходит к следующей строке файла.
Таблица 9.1. Образец анализа входного файла
Поле 1
Разделитель
Поле 2
Разделитель
Поле 3
Разделитель
Поле 4 и символ новой строки.
P. Bunny (запись 1)
#
02/99
#
48
#
Yellow\n
J. Troll (запись 2)
#
07/99
#
4842
#
Brovm-3\n
Инструкция awk состоит из шаблона и связанной с ним процедуры, причем количество инструкций в сценарии awk может быть очень велико. Шаблонная часть уточняет, когда следует выполнять инструкцию либо к каким входным данным она должна применяться. Процедура определяет порядок обработки данных.
Шаблоном может служить любая условная или составная конструкция либо регулярное выражение. Существует также два специальных шаблона: begin и end; Шаблон begin применяется для инициализации переменных и создания заголовков отчета. Связанная с ним процедура выполняется перед началом обработки входного файла. Шаблон end употребляется для вывода итоговых данных и выполнения инструкций по завершении обработки файла. Если никакой шаблон не указан, процедура выполняется для каждой записи из входного файла.
Тело процедуры заключается в фигурные скобки. Чаще всего процедура осуществляет вывод информации на экран, но она может также содержать операторы присваивания, управляющие конструкции и встроенные функции. Если процедура не задана, утилита awk выводит на экран все содержимое записи, соответствующей шаблону.
9.2.2. Работа с полями и записями
На поля текущей записи можно ссылаться следующим образом: $1, $2… $п. Этот метод называется идентификацией полей. Подобная схема обозначений значительно облегчает работу с полями. Например, в качестве ссылки на первое и третье поля достаточно указать:
$1, $3
Обратите внимание на то, что идентификаторы полей разделяются запятой. Чтобы сослаться на все поля записи, содержащей пять полей,
можно указать:$1, $2, $3, $4, $5
Однако проще воспользоваться идентификатором $0, который служит для обозначения всех полей текущей записи.
Когда в процессе просмотра утилита awk встречает символ новой строки, считается, что найден конец записи, после чего выполняется переход к новой строке, анализ новой записи и инициализация полей.
Чтобы вывести на экран содержимое записи, задайте в теле процедуры команду print со списком нужных полей.
Тестовый файл
Прежде чем мы перейдем к практической части, создайте файл grade.txt, на котором основано большинство примеров настоящей главы. Файл этот должен содержать несколько записей из локальной базы данных секции каратистов.
$ cat 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
J. Troll
07/99
4842
Brown-3
12
26
26
L. Tansley
05/99
4712
Brown-2
12
30
28
Назначение полей таково:
1 — имя;
2 — дата получения пояса;
3 — порядковый номер ученика;
4 — полученный пояс;
5 — возраст;
6 — текущий рейтинг;
7 — максимальное количество рейтинговых очков, которое можно было получить за участие в прошедшем соревновании.
Поля разделяются пробелами, поэтому при вызове утилиты awk можно не указывать опцию -F.
Сохранение выходных данных
В качестве небольшого отступления напомним, что существует два способа, позволяющих сохранить результаты работы утилиты awk. Первый, более простой, способ состоит в том, чтобы перенаправить выходной поток в требуемый файл:
$ awk '{print $0}' grade.txt > grade.out
При этом выходные данные не будут отображаться на экране.
Второй способ заключается в применении команды tee, о которой рассказывалось в главе 5. Выходные данные передаются в файл и одновременно отображаются на экране. Например:
$ awk '{print $0}' grade.txt | tee grade.out
Отображение всех записей
В приведенной ниже команде утилита awk просматривает файл grade.txt и, поскольку шаблон не указан, отображает содержимое всех записей:
$ 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