8 мощных встроенных переменных Awk - FS, OFS, RS, ORS, NR, NF, FILENAME, FNR

  1. 1. Awk FS Пример: переменная поля ввода поля.
  2. 2. Пример Awk OFS: переменная разделителя выходного поля
  3. 3. Пример Awk RS: переменная разделителя записей
  4. 4. Пример Awk ORS: переменная разделителя выходных записей
  5. 5. Awk NR Пример: переменная количества записей
  6. 6. Пример Awk NF: количество полей в записи
  7. 7. Awk FILENAME Пример: имя текущего входного файла
  8. 8. Пример Awk FNR: количество записей относительно текущего входного файла
  9. Рекомендуемое чтение

Эта статья является частью продолжающегося   Awk Tutorial Примеры   серии Эта статья является частью продолжающегося Awk Tutorial Примеры серии. В Awk есть несколько мощных встроенных переменных. В Awk есть два типа встроенных переменных.

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

1. Awk FS Пример: переменная поля ввода поля.

По умолчанию Awk читает и анализирует каждую строку из ввода на основе символа пробела и устанавливает переменные $ 1, $ 2 и т. Д. Переменная Awk FS используется для установки разделителя полей для каждой записи. Awk FS может быть установлен на любой отдельный символ или регулярное выражение. Вы можете использовать разделитель поля ввода, используя один из следующих двух вариантов:

  1. Использование опции -F командной строки.
  2. Awk FS можно установить как обычную переменную.

Синтаксис: $ awk -F 'FS' 'команды' inputfilename (или) $ awk 'BEGIN {FS = "FS";}'

  • Awk FS - это любой отдельный символ или регулярное выражение, которое вы хотите использовать в качестве разделителя поля ввода.
  • Awk FS может быть изменен любое количество раз, он сохраняет свои значения, пока не будет явно изменен. Если вы хотите изменить разделитель полей, его лучше изменить, прежде чем читать строку. Так что это изменение влияет на строку, которую вы читаете.

Вот пример awk FS для чтения файла / etc / passwd, который имеет «:» в качестве разделителя полей.

$ cat etc_passwd.awk BEGIN {FS = ":"; print "Name \ tUserID \ tGroupID \ tHomeDirectory"; } {print $ 1 "\ t" $ 3 "\ t" $ 4 "\ t" $ 6; } END {print NR, "Обработано записей"; } $ awk -f etc_passwd.awk / etc / passwd Имя UserID GroupID HomeDirectory gnats 41 41 / var / lib / gnats libuuid 100 101 / var / lib / libuuid syslog 101 102 / home / syslog hplip 103 7 / var / run / hplip avahi 105 111 / var / run / avahi-daemon saned 110 116 / home / saned Pulse 111 117 / var / run / pulse gdm 112 119 / var / lib / gdm 8 Обработано записей

2. Пример Awk OFS: переменная разделителя выходного поля

Awk OFS - это выходной эквивалент переменной awk FS. По умолчанию awk OFS - это один пробел. Ниже приведен пример awk OFS.

$ awk -F ':' '{print $ 3, $ 4;}' / etc / passwd 41 41 100 101 101 102 103 7 105 111 110 116 111 117 112 119

Конкатенатор в операторе печати «,» объединяет два параметра с пробелом, который по умолчанию является значением awk OFS. Таким образом, значение Awk OFS будет вставлено между полями в выводе, как показано ниже.

$ awk -F ':' 'BEGIN {OFS = "=";} {print $ 3, $ 4;}' / etc / passwd 41 = 41 100 = 101 101 = 102 103 = 7 105 = 111 110 = 116 111 = 117 112 = 119

3. Пример Awk RS: переменная разделителя записей

Awk RS определяет линию. Awk читает построчно по умолчанию.

Давайте предположим, что оценки учеников хранятся в файле, каждая запись разделяется двойной новой строкой, а каждое поле разделяется символом новой строки.

$ cat student.txt Джонс 2143 78 84 77 Gondrol 2321 56 58 45 RinRao 2122 38 37 65 Эдвин 2537 78 67 45 Даян 2415 30 47 20

Теперь приведенный ниже скрипт Awk выводит имя студента и Rollno из указанного выше входного файла.

$ cat student.awk BEGIN {RS = "\ n \ n"; FS = "\ п"; } {print $ 1, $ 2; } $ awk -f student.awk student.txt Джонс 2143 Гондрол 2321 РинРао 2122 Эдвин 2537 Даян 2415

В скрипте student.awk каждая деталь учащегося читается как отдельная запись, поскольку awk RS был назначен для двойного символа новой строки, а каждая строка в записи является полем, поскольку FS - символ новой строки.

4. Пример Awk ORS: переменная разделителя выходных записей

Awk ORS является выходным эквивалентом RS. Каждая запись в выводе будет напечатана с этим разделителем. Ниже приведен пример ORK для awk:

$ awk 'BEGIN {ORS = "=";} {print;}' оценки учеников Джонс 2143 78 84 77 = Gondrol 2321 56 58 45 = RinRao 2122 38 37 65 = Эдвин 2537 78 67 45 = Даян 2415 30 47 20 =

В приведенном выше сценарии каждая запись в файле меток учеников ограничивается символом «=».

5. Awk NR Пример: переменная количества записей

Awk NR дает вам общее количество обрабатываемых записей или номер строки. В следующем примере awk NR переменная NR имеет номер строки, в разделе END awk NR сообщает вам общее количество записей в файле.

$ awk '{print "Обработка записи -", NR;} END {print NR, "Записи студента обрабатываются";}' Запись обработки студентами - 1 Запись обработки - 2 Запись обработки - 3 Запись обработки - 4 Запись обработки - 5 5 Студенческие записи обрабатываются

6. Пример Awk NF: количество полей в записи

Awk NF дает вам общее количество полей в записи. Awk NF будет очень полезен для проверки наличия всех полей в записи.

Давайте возьмем в файл оценок учеников, для учеников отсутствует оценка Test3, как показано ниже.

$ cat студент-отметки Джонс 2143 78 84 77 Gondrol 2321 56 58 45 RinRao 2122 38 37 Эдвин 2537 78 67 45 Даян 2415 30 47

Следующий скрипт Awk печатает номер записи (строки) и количество полей в этой записи. Так что будет очень легко узнать, что оценка Test3 отсутствует.

$ awk '{print NR, "->", NF}' оценки учеников 1 -> 5 2 -> 5 3 -> 4 4 -> 5 5 -> 4

7. Awk FILENAME Пример: имя текущего входного файла

Переменная FILENAME дает имя читаемого файла. Awk может принять количество входных файлов для обработки.

$ awk '{print FILENAME}' отметки учащихся отметки учащихся отметки учащихся отметки учащихся отметки учащихся

В приведенном выше примере он печатает FILENAME, т. Е. Оценки учеников, для каждой записи входного файла.

8. Пример Awk FNR: количество записей относительно текущего входного файла

Когда awk читает данные из нескольких входных файлов, переменная awk NR выдаст общее количество записей относительно всего входного файла. Awk FNR выдаст вам количество записей для каждого входного файла.

$ awk '{print FILENAME, FNR;}' книга оценок учеников 1 оценка учеников 1 оценки учеников 2 оценки учеников 3 оценки учеников 4 оценки учеников 5 книг подробно 1 книга подробно 2 книги подробно 3 книги подробно 4 книги подробно 5 книг 5

В приведенном выше примере вместо awk FNR, если вы используете awk NR, для файла bookdetails вы получите от 6 до 10 для каждой записи.

Рекомендуемое чтение

Sed and Awk 101 Hacks   Рамеш Натараджан Sed and Awk 101 Hacks Рамеш Натараджан . Я провожу несколько часов в день в среде UNIX / Linux, работая с текстовыми файлами (данными, файлами конфигурации и журналами). Я использую Sed и Awk для всей моей работы с текстом. Основываясь на своем опыте Sed и Awk, я написал электронную книгу Sed and Awk 101 Hacks, в которой содержится 101 практический пример различных расширенных функций Sed и Awk, которые улучшат вашу жизнь в UNIX / Linux. Даже если вы уже несколько лет используете Sed и Awk и не читали эту книгу, сделайте себе одолжение и прочитайте эту книгу. Вы будете поражены возможностями утилит Sed и Awk.

Если вам понравилась эта статья, вам также может понравиться ..