Узнайте, как использовать встроенные переменные Awk — часть 10
Раскрывая раздел функций Awk, в этой части серии мы рассмотрим концепцию встроенных переменных в Awk. В Awk можно использовать два типа переменных: определяемые пользователем переменные, которые мы рассмотрели в части 8, и встроенные переменные.
Встроенные переменные имеют значения, уже определенные в Awk, но мы также можем осторожно изменять эти значения. К встроенным переменным относятся:
FILENAME
: имя текущего входного файла (не меняйте имя переменной)FR
: номер текущей строки ввода (то есть строки ввода 1, 2, 3… и т. д., не меняйте имя переменной)NF
: количество полей в текущей строке ввода (не меняйте имя переменной)OFS
: разделитель полей вывода.FS
: разделитель полей ввода.ORS
: разделитель выходных записей.RS
: разделитель входных записей.
Давайте перейдем к иллюстрации использования некоторых встроенных переменных Awk, описанных выше:
Чтобы прочитать имя текущего входного файла, вы можете использовать встроенную переменную FILENAME
следующим образом:
awk ' { print FILENAME } ' ~/domains.txt
Вы поймете, что имя файла выводится для каждой строки ввода, что является поведением Awk по умолчанию, когда вы используете встроенную переменную FILENAME
.
Используя NR
для подсчета количества строк (записей) во входном файле, помните, что он также подсчитывает пустые строки, как мы увидим в примере ниже.
Когда мы просматриваем файл domains.txt с помощью команды cat, он содержит 14 строк с текстом и пустые 2 строки:
cat ~/domains.txt
awk ' END { print "Number of records in file is: ", NR } ' ~/domains.txt
Чтобы подсчитать количество полей в записи или строке, мы используем встроенную переменную NR следующим образом:
cat ~/names.txt
awk '{ print "Record:",NR,"has",NF,"fields" ; }' ~/names.txt
Далее вы также можете указать разделитель полей ввода с помощью встроенной переменной FS
. Она определяет, как Awk делит строки ввода на поля.
Значением по умолчанию для FS
является пробел и табуляция, но мы можем изменить значение FS
на любой символ, который даст команду Awk разделить входные строки соответствующим образом.
Есть два способа сделать это:
- один из способов — использовать встроенную переменную FS.
- и второй — вызвать параметр -F Awk.
Рассмотрим файл /etc/passwd в системе Linux. Поля в этом файле разделены с помощью символа :
, поэтому мы можем указать его в качестве нового разделителя полей ввода, когда мы хотим отфильтровать определенные поля, как в следующих примерах:
Мы можем использовать опцию -F
следующим образом:
awk -F':' '{ print $1, $4 ;}' /etc/passwd
При желании мы также можем воспользоваться встроенной переменной FS
, как показано ниже:
awk ' BEGIN { FS=“:” ; } { print $1, $4 ; } ' /etc/passwd
Чтобы указать разделитель полей вывода, используйте встроенную переменную OFS
. Она определяет, как поля вывода будут разделены с помощью символа, который мы используем, как в примере ниже:
awk -F':' ' BEGIN { OFS="==>" ;} { print $1, $4 ;}' /etc/passwd
В этой Части 10 мы исследовали идею использования встроенных переменных Awk с предопределенными значениями. Но мы также можем изменить эти значения, однако не рекомендуется это делать, если вы не знаете, что делаете, и не обладаете адекватным пониманием.
После этого мы перейдем к рассмотрению того, как использовать переменные оболочки в командных операциях Awk, поэтому оставайтесь на связи с Tecmint.