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}'
Переменная среды $PWD хранит путевое имя текущего каталога.
9.2.10. Встроенные функции работы со строками
Утилита awk располагает набором универсальных функций преобразования строк. В табл. 9.4 перечислены основные из них.
Таблица 9.4. Функции работы со строками
Функция
Назначение
gsub(r,.s)
Выполняет глобальную замену каждой строки, соответствующей регулярному выражению г, строкой s в пределах текущей записи; появилась в nawk
index(s, t)
Возвращает позицию первого вхождения подстроки t в строку s
length(s)
Возвращает длину строки s
match(s, r)
Проверяет, содержит ли строка s подстроку, соответствующую, регулярному выражению r; появилась в nawk
split(s, a,fs)
Разбивает строку s на элементы, разделенные символом fs, и помещает полученные элементы в массив а
sub(r, s)
Выполняет замену самой первой строки, соответствующей регулярному выражению r, строкой s в пределах текущей записи; появилась в nawk
substr(s, p[,n])
Возвращает подстроку строки s, начинающуюся с позиции p и имеющую длину n; если аргумент п не задан, концом подстроки считается символ \0 (признак конца строки)
Функция gsub()
Благодаря функции gsub() вы сможете выполнить в текущей записи глобальную замену строк, соответствующих заданному регулярному выражению. Например, для изменения номера ученика с 4842 на 4899 введите такую команду:
$ awk 'gsub(4842,4899) {print $0}' grade.txt
J. Troll 07/99 4899 Brown-3 12 26 26
Функция index()
Чтобы узнать позицию первого вхождения подстроки t в строку s, воспользуйтесь функцией index (), только не забудьте взять ее аргументы в двойные кавычки, иначе они будут восприниматься как имена переменных среды. Например, следующая команда возвращает число, определяющее позицию подстроки "ny" в строке "Bunny":
$ awk 'BEGIN {print index("Bunny","ny")}' grade.txt
4
Функция length()
Функция length() возвращает длину переданного ей текстового аргумента. В показанном ниже примере производится поиск информации об ученике с номером 4842, а затем определяется длина имени ученика:
$ awk '$3=4842 {print length($1)" "$1}' grade.txt
7 J.Troll
Следующая команда демонстрирует применение утилиты awk для вычисления длины текстовой строки:
$ awk 'BEGIN {print length("A FEW GOOD MEN")}'
14
Функция match()
Функция match() позволяет проверить, содержит ли строка заданную подстроку. Последняя может быть представлена как литералом в двойных кавычках, так и регулярным выражением. Если поиск прошел успешно, возвращается число, определяющее позицию, с которой начинается вхождение подстроки в искомую строку. В случае неудачи возвращается ноль. Следующая команда проверяет, содержит ли имя ученика с номером 48317 символ 'u':
$ awk '$3=48317 {print match ($1, "u"), $1} ' grade.txt
4 J. Lulu
Функция split()
Функция split() преобразует переданную ей строку в массив и возвращает число элементов в полученном массиве. В следующем примере заданная строка разбивается на три элемента, которые помещаются в массив myarray. Разделителем элементов в данном случае является символ '#'.
$ awk 'BEGIN {print split("123#456#678", myarray,"#"))'