time

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

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)

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

blog comments powered by Disqus