AWK предоставляет несколько встроенных переменных. Они играют важную роль при написании сценариев AWK. Эта глава демонстрирует использование встроенных переменных.
Стандартные переменные AWK
Стандартные переменные AWK обсуждаются ниже.
ARGC
Это подразумевает количество аргументов, представленных в командной строке.
пример
[jerry]$ awk 'BEGIN {print "Arguments =", ARGC}' One Two Three Four
Выполнив этот код, вы получите следующий результат —
Выход
Arguments = 5
Но почему AWK показывает 5, когда вы передали только 4 аргумента? Просто проверьте следующий пример, чтобы очистить ваши сомнения.
ARGV
Это массив, в котором хранятся аргументы командной строки. Допустимый индекс массива — от 0 до ARGC-1.
пример
[jerry]$ awk 'BEGIN { for (i = 0; i < ARGC - 1; ++i) { printf "ARGV[%d] = %s\n", i, ARGV[i] } }' one two three four
Выполнив этот код, вы получите следующий результат —
Выход
ARGV[0] = awk ARGV[1] = one ARGV[2] = two ARGV[3] = three
CONVFMT
Он представляет формат преобразования для чисел. Его значение по умолчанию % .6g .
пример
[jerry]$ awk 'BEGIN { print "Conversion Format =", CONVFMT }'
Выполнив этот код, вы получите следующий результат —
Выход
Conversion Format = %.6g
ЭНВАЙРОН
Это ассоциативный массив переменных среды.
пример
[jerry]$ awk 'BEGIN { print ENVIRON["USER"] }'
Выполнив этот код, вы получите следующий результат —
Выход
jerry
Чтобы найти имена других переменных среды, используйте команду env .
ИМЯ ФАЙЛА
Он представляет текущее имя файла.
пример
[jerry]$ awk 'END {print FILENAME}' marks.txt
Выполнив этот код, вы получите следующий результат —
Выход
marks.txt
Обратите внимание, что FILENAME не определен в блоке BEGIN.
FS
Он представляет собой (входной) разделитель полей, и его значением по умолчанию является пробел. Вы также можете изменить это, используя параметр командной строки -F .
пример
[jerry]$ awk 'BEGIN {print "FS = " FS}' | cat -vte
Выполнив этот код, вы получите следующий результат —
Выход
FS = $
NF
Он представляет количество полей в текущей записи. Например, в следующем примере печатаются только те строки, которые содержат более двух полей.
пример
[jerry]$ echo -e "One Two\nOne Two Three\nOne Two Three Four" | awk 'NF > 2'
Выполнив этот код, вы получите следующий результат —
Выход
One Two Three One Two Three Four
NR
Он представляет номер текущей записи. Например, следующий пример печатает запись, если номер текущей записи меньше трех.
пример
[jerry]$ echo -e "One Two\nOne Two Three\nOne Two Three Four" | awk 'NR < 3'
Выполнив этот код, вы получите следующий результат —
Выход
One Two One Two Three
FNR
Это похоже на NR, но относительно текущего файла. Это полезно, когда AWK работает с несколькими файлами. Значение FNR сбрасывается с новым файлом.
OFMT
Он представляет номер выходного формата, и его значением по умолчанию является % .6g .
пример
[jerry]$ awk 'BEGIN {print "OFMT = " OFMT}'
Выполнив этот код, вы получите следующий результат —
Выход
OFMT = %.6g
OFS
Он представляет разделитель выходного поля, и его значением по умолчанию является пробел.
пример
[jerry]$ awk 'BEGIN {print "OFS = " OFS}' | cat -vte
Выполнив этот код, вы получите следующий результат —
Выход
OFS = $
ORS
Он представляет разделитель выходных записей, и его значением по умолчанию является перевод строки.
пример
[jerry]$ awk 'BEGIN {print "ORS = " ORS}' | cat -vte
Выполнив приведенный выше код, вы получите следующий результат —
Выход
ORS = $ $
RLENGTH
Он представляет длину строки, сопоставленной функцией соответствия. Функция соответствия AWK ищет данную строку во входной строке.
пример
[jerry]$ awk 'BEGIN { if (match("One Two Three", "re")) { print RLENGTH } }'
Выполнив этот код, вы получите следующий результат —
Выход
2
RS
Он представляет (входной) разделитель записей, и его значением по умолчанию является перевод строки.
пример
[jerry]$ awk 'BEGIN {print "RS = " RS}' | cat -vte
Выполнив этот код, вы получите следующий результат —
Выход
RS = $ $
RSTART
Он представляет первую позицию в строке, сопоставленной функцией соответствия.
пример
[jerry]$ awk 'BEGIN { if (match("One Two Three", "Thre")) { print RSTART } }'
Выполнив этот код, вы получите следующий результат —
Выход
9
SUBSEP
Он представляет символ разделителя для индексов массива, и его значение по умолчанию равно \ 034 .
пример
[jerry]$ awk 'BEGIN { print "SUBSEP = " SUBSEP }' | cat -vte
Выполнив этот код, вы получите следующий результат —
Выход
SUBSEP = ^\$
$ 0
Он представляет всю входную запись.
пример
[jerry]$ awk '{print $0}' marks.txt
Выполнив этот код, вы получите следующий результат —
Выход
1) Amit Physics 80 2) Rahul Maths 90 3) Shyam Biology 87 4) Kedar English 85 5) Hari History 89
$ п
Он представляет n- е поле в текущей записи, где поля разделены символом FS.
пример
[jerry]$ awk '{print $3 "\t" $4}' marks.txt
Выполнив этот код, вы получите следующий результат —
Выход
Physics 80 Maths 90 Biology 87 English 85 History 89
GNU AWK Конкретные переменные
GNU AWK конкретные переменные являются следующими —
ARGIND
Он представляет индекс в ARGV текущего обрабатываемого файла.
пример
[jerry]$ awk '{ print "ARGIND = ", ARGIND; print "Filename = ", ARGV[ARGIND] }' junk1 junk2 junk3
Выполнив этот код, вы получите следующий результат —
Выход
ARGIND = 1 Filename = junk1 ARGIND = 2 Filename = junk2 ARGIND = 3 Filename = junk3
BINMODE
Он используется для указания двоичного режима для всех файловых операций ввода-вывода в системах, не поддерживающих POSIX. Числовые значения 1, 2 или 3 указывают, что входные файлы, выходные файлы или все файлы, соответственно, должны использовать двоичный ввод / вывод. Строковые значения r или w указывают, что входные или выходные файлы, соответственно, должны использовать двоичный ввод / вывод. Строковые значения rw или wr указывают, что все файлы должны использовать двоичный ввод / вывод.
ERRNO
Строка указывает на ошибку при сбое перенаправления для getline или сбое вызова close .
пример
[jerry]$ awk 'BEGIN { ret = getline < "junk.txt"; if (ret == -1) print "Error:", ERRNO }'
Выполнив этот код, вы получите следующий результат —
Выход
Error: No such file or directory
FIELDWIDTHS
Задан разделенный пробелами список переменных ширины поля, GAWK анализирует входные данные в поля фиксированной ширины вместо использования значения переменной FS в качестве разделителя полей.
IGNORECASE
Когда эта переменная установлена, GAWK становится без учета регистра. Следующий пример демонстрирует это —
пример
[jerry]$ awk 'BEGIN{IGNORECASE = 1} /amit/' marks.txt
Выполнив этот код, вы получите следующий результат —
Выход
1) Amit Physics 80
LINT
Он обеспечивает динамическое управление опцией —lint из программы GAWK. Когда эта переменная установлена, GAWK печатает предупреждения lint. При присвоении строкового значения фатальному предупреждения lint становятся фатальными ошибками, точно так же как —lint = fatal .
пример
[jerry]$ awk 'BEGIN {LINT = 1; a}'
Выполнив этот код, вы получите следующий результат —
Выход
awk: cmd. line:1: warning: reference to uninitialized variable `a' awk: cmd. line:1: warning: statement has no effect
PROCINFO
Это ассоциативный массив, содержащий информацию о процессе, такую как действительные и эффективные номера UID, идентификационный номер процесса и т. Д.
пример
[jerry]$ awk 'BEGIN { print PROCINFO["pid"] }'
Выполнив этот код, вы получите следующий результат —
Выход
4316
ДОМЕН
Он представляет собой текстовый домен программы AWK. Он используется для поиска локализованных переводов для строк программы.
пример
[jerry]$ awk 'BEGIN { print TEXTDOMAIN }'
Выполнив этот код, вы получите следующий результат —
Выход
messages
Приведенный выше вывод показывает текст на английском языке из-за локали en_IN