awk: парсинг файлов по шаблону Linux 08.05.2011

awk — интерпретируемый скриптовый язык построчного разбора и обработки входного потока (например, текстового файла) по заданным шаблонам. Позволяет манипулировать структурированными данными и генерировать отчеты. awk относиться к языкам программирования, управляемых данными (data driven), который разработан для обработки текстовых данных, либо в файлах либо в потоках данных.

Лично для меня awk оказался удобен при разборе больших лог-файлов. Когда надо в огромном наборе строк определить какую-то аномалию, но не просто ее найти (для этого можно воспользоваться и обычным grep), а вычислить на основание других данных в строке.

Запуск awk выглядит так

awk '/pattern/{action}' file

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

awk /proft/ /etc/passwd

Другой пример, где указывается разделить полей (по-умолчанию в качестве разделителя полей используется пробел) и выводятся только первое и шестое поле. В данном случаи - имя и путь к домашнему каталогу пользователя.

awk -F":" '{print $1 " " $6}' /etc/passwd 

Шаблон может содержать условия для фильтрации строк в виде регулярных выражений.

Вывод строк только с упоминанием об пользователе proft

awk -F":" '/proft/{print $1 " " $6}' /etc/passwd

Вывод всех строк, в которых нет упоминания об пользователе proft

awk -F":" '!/proft/{print $1 " " $6}' /etc/passwd

Вывод всех строк, в которых есть упоминания об пользователе proft или root

awk '/proft/||/root/' /etc/passwd

Вывод имен пользователей, которые используют zsh

awk -F":" '{if ($7 ~ /zsh/) print $1;}' /etc/passwd

Перед выводом строк можно произвести замену в них.

awk '{sub(/proft/,"ivan");print}' /etc/passwd

Подсчет количества упоминаний proft в файле /etc/passwd

awk '/proft/{n++};END{print n+0}' /etc/passwd

Суммирование значений в третьем столбце для всех строк.

awk -F":" '{sum +=$3} END {print sum}' /etc/passwd

У awk есть встроенные переменные, наиболее часто используемые

  • Number of fields - NF
  • Record number - NR

Вывести строки, начиная с пятой

awk 'NR > 14' /etc/passwd

Вывести порядковый номер строки перед обрабатываемым текстом

awk '$0 = NR" "$0' /etc/passwd

Вывести строки между 5 и 10 строкой

awk -F":" 'NR==5,NR==10' /etc/passwd

Вывести строки с количеством полей больше 5

awk -F":" 'NF > 5' /etc/passwd 

Вывести строки, в которых значение последнего поля равно /bin/false

awk -F":" '$NF="/bin/false"' /etc/passwd 

Пример парсинга строки

free -m | grep "Mem:" | awk '{print $4"/"$2}'

J4F: Python version

Line-oriented processing in Python from command line (like AWK)

Дополнительное чтиво

Цитата
In order to succeed, your desire for success should be greater than your fear of failure.
Bill Cosby
Категории
Архив