Поиск по сайту:

Узнайте, как использовать встроенные переменные Awk — часть 10


Раскрывая раздел функций Awk, в этой части серии мы рассмотрим концепцию встроенных переменных в Awk. В Awk можно использовать два типа переменных: определяемые пользователем переменные, которые мы рассмотрели в части 8, и встроенные переменные.

Встроенные переменные имеют значения, уже определенные в Awk, но мы также можем осторожно изменять эти значения. К встроенным переменным относятся:

  1. FILENAME: имя текущего входного файла (не меняйте имя переменной)
  2. FR: номер текущей строки ввода (то есть строки ввода 1, 2, 3… и т. д., не меняйте имя переменной)
  3. NF: количество полей в текущей строке ввода (не меняйте имя переменной)
  4. OFS : разделитель полей вывода.
  5. FS: разделитель полей ввода.
  6. ORS : разделитель выходных записей.
  7. 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 разделить входные строки соответствующим образом.

Есть два способа сделать это:

  1. один из способов — использовать встроенную переменную FS.
  2. и второй — вызвать параметр -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.