Переменная 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 хранит путевое имя текущего каталога.
Утилита 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":