Шрифт:
Таблица 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
grade.txt
Переменную NF удобно использовать, когда требуется извлечь из путевого имени последнюю часть, т. е. имя файла или каталога. В этом случае необходимо указать, что разделителем полей является символ '/' и использовать ссылку $NF, которая является обозначением последнего поля текущей записи. Например:
$ pwd
/usr/local/etc
$ echo $PWD | awk -F/ '{print $NF}'