Выбрать главу

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

9.2.9. Встроенные переменные

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

Переменная fnr хранит номер записи, которую утилита awk обрабатывает в текущий момент; ее значение меньше или равно значению переменной NR, которая отслеживает общее число обработанных записей входного потока. Если сценарий получает доступ более чем к одному файлу, переменная FNR сбрасывается в ноль при открытии каждого нового файла. В переменную NF записывается количество полей текущей записи. Ее значение сбрасывается по достижении конца записи.

Переменная FS содержит символ, используемый в качестве разделителя полей входного потока. Эту переменную можно установить из командной строки с помощью опиии -F. По умолчанию разделителем полей служит пробел. Переменная ofs содержит символ, являющийся разделителем полей в выходном потоке. По умолчанию это тоже пробел.

В переменной ORS хранится разделитель записей в выходном потоке. По умолчанию им является символ новой строки (\n). Переменная RS содержит разделитель записей во входном потоке (в большинстве случаев это тоже символ \n).

Переменные NF, NR и FILENAME

Представленная ниже команда позволяет быстро определить число записей во входном файле grade.txt. Значение переменной NR отображается по завершении обработки файла.

$ awk 'END {print NR}' grade.txt

В следующем примере на экран выводятся все записи исходного файла. Каждой из них предшествуют два числа: количество полей в записи (переменная NF) и номер записи в файле (переменная nr). В самом конце отображается имя входного файла (переменная FILENAME).

$ awk '{print NF, NR, $0} END {print FILENAME}' grade.txt

1 M. Tansley 05/99 48311 Green 8 40 44
2 J. Lulu 06/99 48317 green 9 24 26
3 P. Bunny 02/99 48 Yellow 12 35 28
4 J. Troll 07/99 4842 Brown-3 12 26 26
5 L. Tansley 05/99, 4712 Brown-2 12 30 28