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 есть встроенные переменные, наиболее часто используемые
Вывести строки, начиная с пятой
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)
Дополнительное чтиво