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

AWK предоставляет несколько встроенных переменных. Они играют важную роль при написании сценариев AWK. В этой главе демонстрируется использование встроенных переменных.

Стандартные переменные AWK

Стандартные переменные AWK обсуждаются ниже.

ARGC

Подразумевается количество аргументов, предоставленных в командной строке.

Example

[jerry]$ awk 'BEGIN {print "Arguments =", ARGC}' One Two Three Four

Выполнив этот код, вы получите следующий результат -

Output

Arguments = 5

Но почему AWK показывает 5, когда вы передали только 4 аргумента? Просто проверьте следующий пример, чтобы развеять ваши сомнения.

ARGV

Это массив, в котором хранятся аргументы командной строки. Допустимый индекс массива находится в диапазоне от 0 до ARGC-1.

Example

[jerry]$ awk 'BEGIN { 
   for (i = 0; i < ARGC - 1; ++i) { 
      printf "ARGV[%d] = %s\n", i, ARGV[i] 
   } 
}' one two three four

Выполнив этот код, вы получите следующий результат -

Output

ARGV[0] = awk
ARGV[1] = one
ARGV[2] = two
ARGV[3] = three

CONVFMT

Он представляет собой формат преобразования чисел. Его значение по умолчанию%.6g.

Example

[jerry]$ awk 'BEGIN { print "Conversion Format =", CONVFMT }'

Выполнив этот код, вы получите следующий результат -

Output

Conversion Format = %.6g

ENVIRON

Это ассоциативный массив переменных среды.

Example

[jerry]$ awk 'BEGIN { print ENVIRON["USER"] }'

Выполнив этот код, вы получите следующий результат -

Output

jerry

Чтобы найти имена других переменных среды, используйте env команда.

ИМЯ ФАЙЛА

Он представляет текущее имя файла.

Example

[jerry]$ awk 'END {print FILENAME}' marks.txt

Выполнив этот код, вы получите следующий результат -

Output

marks.txt

Обратите внимание, что FILENAME не определено в блоке BEGIN.

FS

Он представляет собой разделитель (входного) поля, а его значение по умолчанию - пробел. Вы также можете изменить это, используя-F параметр командной строки.

Example

[jerry]$ awk 'BEGIN {print "FS = " FS}' | cat -vte

Выполнив этот код, вы получите следующий результат -

Output

FS =  $

NF

Он представляет количество полей в текущей записи. Например, в следующем примере печатаются только те строки, которые содержат более двух полей.

Example

[jerry]$ echo -e "One Two\nOne Two Three\nOne Two Three Four" | awk 'NF > 2'

Выполнив этот код, вы получите следующий результат -

Output

One Two Three
One Two Three Four

NR

Он представляет собой номер текущей записи. Например, в следующем примере запись печатается, если текущий номер записи меньше трех.

Example

[jerry]$ echo -e "One Two\nOne Two Three\nOne Two Three Four" | awk 'NR < 3'

Выполнив этот код, вы получите следующий результат -

Output

One Two
One Two Three

FNR

Он похож на NR, но относительно текущего файла. Это полезно, когда AWK работает с несколькими файлами. Значение FNR сбрасывается с новым файлом.

OFMT

Он представляет собой номер выходного формата, а его значение по умолчанию - %.6g.

Example

[jerry]$ awk 'BEGIN {print "OFMT = " OFMT}'

Выполнив этот код, вы получите следующий результат -

Output

OFMT = %.6g

OFS

Он представляет собой разделитель выходных полей, а его значение по умолчанию - пробел.

Example

[jerry]$ awk 'BEGIN {print "OFS = " OFS}' | cat -vte

Выполнив этот код, вы получите следующий результат -

Output

OFS =  $

ОРС

Он представляет собой разделитель выходной записи, а его значение по умолчанию - новая строка.

Example

[jerry]$ awk 'BEGIN {print "ORS = " ORS}' | cat -vte

Выполнив приведенный выше код, вы получите следующий результат -

Output

ORS = $
$

ДЛИНА

Он представляет собой длину строки, соответствующей matchфункция. Функция соответствия AWK ищет заданную строку во входной строке.

Example

[jerry]$ awk 'BEGIN { if (match("One Two Three", "re")) { print RLENGTH } }'

Выполнив этот код, вы получите следующий результат -

Output

2

RS

Он представляет собой (входной) разделитель записей, а его значение по умолчанию - новая строка.

Example

[jerry]$ awk 'BEGIN {print "RS = " RS}' | cat -vte

Выполнив этот код, вы получите следующий результат -

Output

RS = $
$

RSTART

Он представляет собой первую позицию в строке, совпадающую с match функция.

Example

[jerry]$ awk 'BEGIN { if (match("One Two Three", "Thre")) { print RSTART } }'

Выполнив этот код, вы получите следующий результат -

Output

9

ПОДПИСЬ

Он представляет собой символ-разделитель для индексов массива, а его значение по умолчанию - \034.

Example

[jerry]$ awk 'BEGIN { print "SUBSEP = " SUBSEP }' | cat -vte

Выполнив этот код, вы получите следующий результат -

Output

SUBSEP = ^\$

$ 0

Он представляет собой всю входную запись.

Example

[jerry]$ awk '{print $0}' marks.txt

Выполнив этот код, вы получите следующий результат -

Output

1) Amit     Physics   80
2) Rahul    Maths     90
3) Shyam    Biology   87
4) Kedar    English   85
5) Hari     History   89

$ n

Он представляет собой n- е поле в текущей записи, где поля разделены FS.

Example

[jerry]$ awk '{print $3 "\t" $4}' marks.txt

Выполнив этот код, вы получите следующий результат -

Output

Physics   80
Maths     90
Biology   87
English   85
History   89

Специфические переменные GNU AWK

Специфические переменные GNU AWK следующие:

АРГИНД

Он представляет собой индекс текущего обрабатываемого файла в ARGV.

Example

[jerry]$ awk '{ 
   print "ARGIND   = ", ARGIND; print "Filename = ", ARGV[ARGIND] 
}' junk1 junk2 junk3

Выполнив этот код, вы получите следующий результат -

Output

ARGIND   =  1
Filename =  junk1
ARGIND   =  2
Filename =  junk2
ARGIND   =  3
Filename =  junk3

BINMODE

Он используется для указания двоичного режима для всех файловых операций ввода-вывода в системах, отличных от POSIX. Числовые значения 1, 2 или 3 указывают, что входные файлы, выходные файлы или все файлы, соответственно, должны использовать двоичный ввод-вывод. Строковые значенияr или wукажите, что входные или выходные файлы, соответственно, должны использовать двоичный ввод-вывод. Строковые значенияrw или wr укажите, что все файлы должны использовать двоичный ввод-вывод.

ERRNO

Строка указывает на ошибку при сбое перенаправления для getline или если close вызов не удается.

Example

[jerry]$ awk 'BEGIN { ret = getline < "junk.txt"; if (ret == -1) print "Error:", ERRNO }'

Выполнив этот код, вы получите следующий результат -

Output

Error: No such file or directory

ПОЛЯ

Устанавливается список разделенных пробелами переменных ширины полей, GAWK анализирует ввод в поля фиксированной ширины, вместо того, чтобы использовать значение переменной FS в качестве разделителя полей.

ИГНОРИРОВАТЬ

Когда эта переменная установлена, GAWK не учитывает регистр. Следующий пример демонстрирует это -

Example

[jerry]$ awk 'BEGIN{IGNORECASE = 1} /amit/' marks.txt

Выполнив этот код, вы получите следующий результат -

Output

1) Amit  Physics   80

LINT

Обеспечивает динамическое управление --lintвариант из программы GAWK. Когда эта переменная установлена, GAWK печатает предупреждения о ворсинах. При присвоении строковому значению фатального предупреждения о линтах становятся фатальными ошибками, точно так же, как--lint=fatal.

Example

[jerry]$ awk 'BEGIN {LINT = 1; a}'

Выполнив этот код, вы получите следующий результат -

Output

awk: cmd. line:1: warning: reference to uninitialized variable `a'
awk: cmd. line:1: warning: statement has no effect

ПРОЦИНФО

Это ассоциативный массив, содержащий информацию о процессе, такую ​​как реальные и эффективные номера UID, номер идентификатора процесса и так далее.

Example

[jerry]$ awk 'BEGIN { print PROCINFO["pid"] }'

Выполнив этот код, вы получите следующий результат -

Output

4316

ТЕКСТДОМЕН

Он представляет собой текстовую область программы AWK. Он используется для поиска локализованных переводов строк программы.

Example

[jerry]$ awk 'BEGIN { print TEXTDOMAIN }'

Выполнив этот код, вы получите следующий результат -

Output

messages

Приведенный выше вывод показывает английский текст из-за en_IN регион