Руководство пользователя для GNU Awk
2. Начальные сведения об awk
2.5 Более сложный пример
Приведем пример, который дает представление о том, что делают обычные программы awk. Этот пример показывает, как можно использовать awk для суммирования, отбора и перестройки выхода от других программных средств. В нем используются еще не рассмотренные возможности awk, так что не смущайтесь, если вам не все детали будут понятны.
ls -lg -- awk '$6 == "Nov" - sum += $5 ""
END - print sum ""'
Эта программа печатает общее количество байтов во всех файлах текущего каталога, которые в последний раз модифицировались в Ноябре (любого года). (В оболочке Си вам нужно напечатать двоеточие и затем обратный слеш в конце первой строки; в POSIX-подчиненной оболочке, такой как Bourne shell или Bash, GNU Bourne-Again shell пример можно печатать, как показано.)
Часть `ls -lg' этого примера есть системная команда, которая выдает список файлов в каталоге, включающий размеры файлов и даты их последнего изменения. Ее выход выглядит так:
-rw-r--r-- 1 arnold user 1933 Nov 7 13:05 Makefile
-rw-r--r-- 1 arnold user 10809 Nov 7 13:03 gawk.h
-rw-r--r-- 1 arnold user 983 Apr 13 12:14 gawk.tab.h
-rw-r--r-- 1 arnold user 31869 Jun 15 12:20 gawk.y
-rw-r--r-- 1 arnold user 22414 Nov 7 13:03 gawk1.c
-rw-r--r-- 1 arnold user 37455 Nov 7 13:03 gawk2.c
-rw-r--r-- 1 arnold user 27511 Dec 9 13:07 gawk3.c
-rw-r--r-- 1 arnold user 7989 Nov 7 13:03 gawk4.c
Первое поле содержит написанный красным допуск, второе поле содержит количество связей к файлу, третье идентифицирует владельца файла. Четвертое поле указывает группу файла, пятое содержит его размер в байтах. Шестое, седьмое и восьмое содержат соответственно месяц, день и время последней модификации файла. Наконец, девятое поле содержит имя файла.
`$6 == "Nov"' в нашей awk-программе есть выражение, которое проверяет, соответствует ли шестое поле выхода от `ls -lg' цепочке `Nov'. Каждый раз, когда строка имеет цепочку `Nov' своим шестым полем, выполняется действие `sum += $5'. Оно добавляет пятое поле (размер файла) к переменной sum. В результате, когда awk окончит чтение всех входных строк, sum будет содержать сумму всех длин файлов, строки которых соответствуют образцу. (Так будет, потому что все переменные awk автоматически инициализируются нулем.)
После того, как будет обработана последняя строка выхода от ls, выполняется правило END и печатается значение sum. В нашем примере это будет 80600. Использованная здесь более сложная awk-техника объясняется дальше (см. раздел 8.2 [Обзор действий], стр 102). Прежде чем переходить к более сложному awk-программированию, вы должны узнать, как awk обрабатывает ваш ввод и выдает ваш выход. Манипулируя полями и используя операторы печати, вы можете получать очень полезные и впечатляюще выглядящие отчеты.
Назад | Вперед
Содержание (общее) | Содержание раздела
Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
|