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 |
Club student total points: 155
Вероятно, вы заметили, что утилите awk не было дано указание выводить на экран все записи -oна сделала это сама. Причина такого поведения заключается в том, что выражение tot+=$6 относится к шаблонной части инструкции и не задает критерия отбора строк, т.е. применяется ко всем записям. А поскольку процедурная часть этого шаблона отсутствует, выполняется действие по умолчанию — команда print SO.
Если файл велик, можно не выводить на экран все записи, а лишь отобразить итог. Для этого достаточно взять выражение tot+=$6 в фигурные скобки, чтобы перенести его в процедурную часть инструкции:
$ awk '{tot+=$6}; END {print "Club student total points: " tot}' grade.txt
Club student total points: 155
Суммирование размеров файлов
При просмотре содержимого каталога часто требуется узнать общий размер всех файлов в нем, исключая файлы в подкаталогах и скрытые файлы. Алгоритм решения этой задачи таков: результаты работы команды ls -l (формирует список файлов с расширенной информацией о них; см. главу 1) направляются утилите awk, которая удаляет записи, начинающиеся с символа 'd' (признак каталога), и вычисляет сумму по 5–му столбцу (содержит размер файла).
Представленная ниже команда отображает список файлов текущего каталога (имя файла берется из 9–го столбца), указывая размер каждого из них, а в конце выводит суммарный размер файлов, накопленный в переменной tot:
$ ls -l | awk '/^[^d]/ {print $9"\t"$5; tot+=$5} END {print "total KB: "tot}' dev_pkg.fail 345 failedlogin 12416
messages | 4260 |
зи1од | 12810 |
utap | 1856 |
wtap | 7104 |
total KB: 38791 |
Если необходимо включить в список скрытые файлы, следует вместо команду ls -l задать команду 1s -la.
Утилита awk имеет ряд встроенных переменных, которые позволяют получить подробную информацию о входном потоке и настройках awk. Значения некоторых переменных можно изменять. В табл. 9.3 кратко описаны основные переменные.
Таблица 9.3. Встроенные переменные awk
Переменная | Что содержит |
ARGC | Количество аргументов в командной строке (поддерживается только: в nawk и gawk) |
ARGV | Массив аргументов командной строки (поддерживается только в nawk и gawk) |
ENVIRON | Массив переменных среды (поддерживается только в nawk и gawk) |
FILENAME | Имя файла, обрабатываемого в текущий момент |
FNR | Количество уже обработанных записей в текущем файле (поддерживается только в nawk и gawk) |
FS | Разделитель полей во входном потоке (по умолчанию пробел); аналогична опции -F командной строки |
NF | Количество полей в текущей записи |
NR | Количество обработанных записей во входном потоке |
OFS | Разделитель полей в выходном потоке (по умолчанию пробел) |
ORS | Разделитель записей в выходном потоке (по умолчанию символ новой строки) |
RS | Разделитель записей во входном потоке (по умолчанию символ |
новой строки) |
Переменная ARGC хранит число аргументов командной строки, переданной сценарию awk (точнее, nawk или gawk, т. к. эта переменная появилась только в новых версиях утилиты). Переменная argv хранит значения аргументов командной строки. Доступ к нужному аргументу осуществляется с помощью ссылки ARGV[n], где п — порядковый номер аргумента в командной строке.
Переменная environ хранит значения всех текущих переменных среды. Чтобы получить доступ к нужной переменной, следует указать ее имя, например:
ENVIRON["EDITOR"]=="vi"
Поскольку сценарий awk может обрабатывать большое количество файлов, предусмотрена переменная FILENAME, которая указывает на то, какой файл просматривается в текущий момент.