AWK примеры использования для парсинга

AWK - интерпретируемый скриптовый C- подобный язык построчного разбора и обработки входного потока (например, текстового файла) по заданным шаблонам. Утилита AWK, была создана в 1977 году и объединила свойства фильтров Редактор sed и GNU grep. В дальнейшем её возможности значительно расширились. Одним из расширений awk стала nawk, с помощью которой можно обращаться к нескольким файлам в одной программе. Gawk - следующий этап развития awk, в ней реализованы как возможности nawk, так и стандартные средства awk.

AWK рассматривает входной поток как список записей. Каждая запись делится на поля. На основе этой информации выполняется некоторый определённый программистом алгоритм обработки. По умолчанию разделителем записей является символ новой строки (то есть записи — это то же самое, что строки), разделителем полей - символ пробела или табуляции, или последовательность таких символов. Символы-разделители можно явно определить в программе.

AWK- программа состоит из операторов (правил), имеющих вид:

 шаблон {действие}
 шаблон {действие}
 . . .

Каждая запись поочерёдно сравнивается со всеми шаблонами, и каждый раз когда она соответствует шаблону, выполняется указанное действие. Если шаблон не указан, то действие выполняется для любой записи. Если не указано действие, то запись выводится.

Действие может состоять из последовательности операторов, разделяемой точкой с запятой, переводом строки или закрывающей скобкой.
  • Отсортировать файлы по времени создания и вывести последнюю строку
    ls -lt /home/ftp_share/ftp_backup/ | awk 'END{print $9}'
  • Печать всех строк длиннее 80 символов:
    $ cat install.sh | awk '{if (length($0) > 80) print $0}'
  • Вывести пятое поле из вывода команды netstat:
    $ netstat -ntu | awk '{print $5}'
  • Вывести строки, в которых значение первого столбца равно udp:
    # netstat -ntu | awk '$1 == "udp"'
  • Завершить процесс node (слушающему Порты TCP -порт 1277) по его PID:
    #!/bin/bash
    kill -9 `lsof -i:1277 | awk '$0 ~ /node/ {print $2}'`
  • Вывести третью строку из файлы .bash_history
    # awk 'NR==3{print}' .bash_history

Самая частая операция, которую вам придется выполнять в командной строке, где-то надо распарсить лог и вытащить количество IP-адресов, где-то - подсчитать количество вхождений каких-то слов и так далее. Возможно, даже придется парсить csv файл и обрабатывать каждую строчку каким-то хитрым образом. Конечно, большую часть из всего этого можно сделать с помощью стандартных утилит типа cat, grep, wc, head, tail и других, но иногда намного проще написать скрипт на awk для обработки текстовых файлов.

По сути awk - это небольшой язык программирования для обработки текстов. Команда его запуска выглядит так:

$ awk options program file

Где options - это опции, передаваемые awk, program - скрипт, который будет обрабатывать файл, и собственно file - файл, который необходимо разобрать. Основными опциями являются:

  • -F fs — позволяет указать символ-разделитель для полей в записи (в каждой строке);
  • -f file — указывает имя файла, из которого нужно прочесть awk-скрипт;
  • -v var=value — объявляет переменную, которая будет использована в скрипте.

Создадим простейший awk скрипт, который будет читать построчно файл /etc/passwd, разделять его по символу ':' и выводить только первый элемент - то есть имя пользователя.

$ cat /etc/passwd | awk -F ':' '{print $1}'
root
daemon
bin
sys
sync
games
man

С помощью команды cat мы выводим файл на экран и отправляем весь вывод на вход команде awk, которой указываем, что каждую строку надо разбить по символу ':', после чего - вывести первый элемент ($1). В awk можно писать несколько команд, разделяя их точкой с запятой:

$ cat /etc/passwd | awk -F ':' '{print $1; print $3}'

Блок, указанный в фигурных скобках, будет выполнен для каждой строки. То есть awk читает строку и выполняет код, указанный в этих скобках. Если вы хотите разово выполнить какое-то действие, например, объявить переменную в самом начале или в завершении вывести общую информацию по файлу, то для этого надо использовать блоки BEGIN & END. Давайте напишем простой скрипт, который считает количество строк в файле:

$ cat /etc/passwd | awk 'BEGIN {a = 0} {a=a+1} END {print a}'
26

Как вы уже увидели - блоки BEGIN{} и END{} выполнились только один раз. А вот блок {} выполнился 26 раз - по количеству строк в файле. Давайте рассмотрим еще один пример - просуммируем все uid в /etc/passwd:

$ cat /etc/passwd | awk -F ':' 'BEGIN {a = 0} {a=a+$3} END {print a}'
67508

Мы разбиваем каждую строку /etc/passwd по символу ':', объявляем переменную a равную 0, в каждой строке вытаскиваем uid ($3) и прибавляем к перемнной a. И в завершение выводим переменную a на экран.

Помимо простых операций, awk поддерживает и условия if. С помощью awk вы можете быстро и удобно обрабатывать текстовые файлы в терминале.

Zomro хостинг в Нидерландах. Курс - Английский для IT специалистов Источник.