Учебники

AWK — встроенные переменные

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