M.Tansley05/9948311Green84044
J.Lulu06/9948317green92426
P.Bunny02/9948Yellow123528
J.Troll07/994842Brown-3122626
L.Tansley05/994712Brown-2123028

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

messages4260
зи1од12810
utap1856
wtap7104
total KB: 38791

Если необходимо включить в список скрытые файлы, следует вместо команду ls -l задать команду 1s -la.

<p><emphasis><strong>9.2.9. Встроенные переменные</strong></emphasis></p>

Утилита 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, которая указывает на то, какой файл просматривается в текущий момент.

Перейти на страницу:

Похожие книги