AWK - это мощный язык программирования, основанный на данных, который берет свое начало с первых дней существования Unix. Первоначально он был разработан для написания «однострочных» программ, но с тех пор превратился в полноценный язык программирования . AWK получил свое название от инициалов своих авторов - Aho, Weinberger и Kernighan. Команда awk в Linux и других системах Unix вызывает интерпретатор, выполняющий сценарии AWK. В последних системах существует несколько реализаций awk, таких как gawk (GNU awk), mawk (Minimal awk) и nawk (New awk). Посмотрите приведенные ниже примеры, если вы хотите освоить awk.
Понимание программ AWK
Программы, написанные на awk, состоят из правил, которые представляют собой просто пару шаблонов и действий. Шаблоны сгруппированы в фигурную скобку {}, и часть действия запускается всякий раз, когда awk находит тексты, соответствующие шаблону. Хотя awk был разработан для написания однострочников, опытные пользователи могут легко писать сложные сценарии с его помощью.
Программы AWK очень полезны для крупномасштабной обработки файлов. Они идентифицируют текстовые поля, используя специальные символы и разделители. Они также предлагают высокоуровневые программные конструкции, такие как массивы и циклы. Таким образом, написание надежных программ с использованием простого awk вполне осуществимо.
Практические примеры использования команды awk в Linux
Администраторы обычно используют awk для извлечения данных и создания отчетов наряду с другими типами манипуляций с файлами.
Внимательно следуйте командам и попробуйте их в своем терминале для полного понимания.
Распечатайте определенные поля из текстового вывода
Наиболее широко используемые команды Linux отображают свои результаты в различных полях. Обычно мы используем команду Linux cut для извлечения определенного поля из таких данных. Тем не менее, приведенная ниже команда показывает, как это сделать, используя команду awk.
$ who | awk '{print $1}'
Эта команда будет отображать только первое поле из вывода команды who. Таким образом, вы просто получите имена всех зарегистрированных пользователей. Здесь $ 1 представляет первое поле. Вам нужно использовать $ N, если вы хотите извлечь N-ое поле.
Печать нескольких полей из текстового вывода
Интерпретатор awk позволяет нам печатать любое количество полей. В приведенных ниже примерах показано, как извлечь первые два поля из вывода команды who.
$ who | awk '{print $1, $2}'
Вы также можете контролировать порядок полей вывода. В следующем примере сначала отображается второй столбец, созданный командой who, а затем первый столбец во втором поле.
$ who | awk '{print $2, $1}'
Просто пропустите параметры поля ( $ N ), чтобы отобразить все данные.
Используйте Оператор BEGIN
Оператор BEGIN позволяет пользователям выводить некоторую известную информацию в вывод. Обычно используется для форматирования выходных данных, генерируемых awk. Синтаксис этого оператора показан ниже.
BEGIN { Actions}
{ACTION}
Действия, которые формируют раздел BEGIN, всегда запускаются. Затем awk читает оставшиеся строки одну за другой и видит, нужно ли что-то делать.
$ who | awk 'BEGIN {print "User\tFrom"} {print $1, $2}'
Приведенная выше команда помечает два выходных поля, извлеченных из вывода команды who.
Используйте оператор END
Вы также можете использовать оператор END, чтобы убедиться, что определенные действия всегда выполняются в конце вашей операции. Просто поместите раздел END после основного набора действий.
$ who | awk 'BEGIN {print "User\tFrom"} {print $1, $2} END {print "--COMPLETED--"}'
Приведенная выше команда добавит данную строку в конец вывода.
Поиск с использованием шаблонов
Большая часть работы awk включает в себя сопоставление с образцом и регулярным выражением . Как мы уже обсуждали, awk ищет шаблоны в каждой строке ввода и выполняет действие только при совпадении. Наши предыдущие правила состояли только из действий. Ниже проиллюстрированы основы сопоставления с образцом с помощью команды awk в Linux.
$ who | awk '/mary/ {print}'
Эта команда увидит, вошел ли пользователь в данный момент в систему или нет. Он выведет всю строку, если найдено какое-либо совпадение.
Извлечение информации из файлов
Команда awk очень хорошо работает с файлами и может использоваться для сложных задач обработки файлов. Следующая команда иллюстрирует, как awk обрабатывает файлы.
$ awk '/hello/ {print}' /usr/share/dict/american-english
Эта команда ищет шаблон 'hello' в файле англо-американского словаря. Он доступен в большинстве дистрибутивов на основе Linux . Таким образом, вы можете легко попробовать программы awk для этого файла.
Считывать скрипт AWK из исходного файла
Хотя написание однострочных программ полезно, вы также можете писать большие программы, используя полностью awk. Позволяет сохранить их и запустить вашу программу, используя исходный файл.
$ awk -f script-file
$ awk --file script-file
Опция -f или –file позволяет нам указать файл программы. Однако вам не нужно использовать кавычки ('') внутри файла скрипта, поскольку оболочка Linux не будет интерпретировать программный код таким образом.
Установите разделитель поля ввода
Разделитель полей - это разделитель, который разделяет входную запись. Мы можем легко указать разделители полей для awk, используя опцию -F или –field-separator . Проверьте следующие команды, чтобы увидеть, как это работает.
$ echo "This-is-a-simple-example" | awk -F - ' {print $1} '
$ echo "This-is-a-simple-example" | awk --field-separator - ' {print $1} '
Он работает так же при использовании файлов сценариев.
Распечатывать информацию в зависимости от условий
Мы обсуждали команду Linux cut в этом руководстве. Теперь рассмотрим как извлекать информацию с помощью awk, только когда определенные критерии соответствуют. Мы будем использовать тот же тестовый файл, который мы использовали ранее. Так что зайдите туда и сделайте копию файла test.txt .
$ awk '$4 > 50' test.txt
Эта команда выведет все страны из файла test.txt, в котором проживает более 50 миллионов человек.
Распечатайте информацию путем сравнения регулярных выражений
Следующая команда awk проверяет, содержит ли третье поле любой строки шаблон «Лира», и печатает всю строку, если найдено совпадение. Мы снова используем файл test.txt, используемый для иллюстрации команды cut в Linux . Поэтому убедитесь, что у вас есть этот файл, прежде чем продолжить.
$ awk '$3 ~ /Lira/' test.txt
Вы можете распечатать только определенную часть любого совпадения, если хотите.
Подсчитайте общее количество строк на входе
Команда awk имеет много переменных специального назначения, которые позволяют нам легко выполнять многие сложные задачи. Одной из таких переменных является NR, которая содержит номер текущей строки.
$ awk 'END {print NR} ' test.txt
Эта команда выведет количество строк в нашем файле test.txt. Сначала он выполняет итерацию по каждой строке, и как только он достигнет END, он напечатает значение NR, которое содержит общее количество строк в этом случае.
Установите разделитель поля вывода
Ранее мы рассматривали как выбирать разделители входных полей, используя опцию -F или –field-separator . Команда awk также позволяет нам указать разделитель поля вывода. Приведенный ниже пример демонстрирует это на практическом примере.
$ date | awk 'OFS="-" {print$2,$3,$6}'
Эта команда выводит текущую дату в формате дд-мм-гг. Запустите программу date без awk, чтобы увидеть, как выглядит вывод по умолчанию.
Использование If Construct
Как и другие популярные языки программирования , awk также предоставляет пользователям конструкции if-else. Оператор if в awk имеет следующий синтаксис.
if (expression)
{
first_action
second_action
}
Соответствующие действия выполняются только в том случае, если условное выражение истинно. Приведенный ниже пример демонстрирует это с помощью нашего справочного файла test.txt .
$ awk '{ if ($4>100) print }' test.txt
Вам не нужно строго поддерживать отступ.
Использование конструкций If-Else
Вы можете построить полезные лестницы if-else, используя приведенный ниже синтаксис. Они полезны при разработке сложных сценариев awk, которые работают с динамическими данными.
if (expression)
first_action
else
second_action
$ awk '{ if ($4>100) print; else print }' test.txt
Приведенная выше команда напечатает весь справочный файл, поскольку четвертое поле не превышает 100 для каждой строки.
Установите ширину поля
Иногда входные данные довольно беспорядочные, и пользователям может быть трудно их визуализировать в своих отчетах. К счастью, awk предоставляет мощную встроенную переменную под названием FIELDWIDTHS, которая позволяет нам определять разделенный пробелами список значений ширины.
$ echo 5675784464657 | awk 'BEGIN {FIELDWIDTHS= "3 4 5"} {print $1, $2, $3}'
Это очень полезно при разборе разбросанных данных, поскольку мы можем точно контролировать ширину выходного поля.
Установите разделитель записей
RS или Record Separator - это другая встроенная переменная, которая позволяет нам указать, как разделяются записи. Давайте сначала создадим файл, который будет демонстрировать работу этой переменной awk.
$ cat new.txt
Melinda James
23 New Hampshire
(222) 466-1234
Daniel James
99 Phonenix Road
(322) 677-3412
$ awk 'BEGIN{FS="\n"; RS=""} {print $1,$3}' new.txt
Эта команда проанализирует документ и выдаст имя и адрес для двух человек.