awk в Linux
Утилита awk предоставляет большие возможности для обработки строк. Далее вы найдете описание параметров и примеры по обработке текста с помощью awk.
Как и sed, awk читает за один раз одну строку, выполняет определенные действия.
Дополнительные примеры: http://www.opennet.ru/tips/info/1811.shtml
Принцип работы
Конструкция команды awk:
awk ОПЦИИ '/FILTER/ { <КОМАНДА #1>; <КОМАНДА #2>; }'
Базовый пример:
awk -F$"\n" '/^[^ ]+/ { gsub(" +$","",$1); print $1 $2; }'
Принцип работы и порядок выполнения действий awk:
- Разделение каждой входящей строки на колонки (
-F'delimiter'
), по-умолчанию - пробел. Строка или регулярное выражение; - Фильтрация входящей строки с помощью regex (
filter
). Строка или регулярное выражение; - Обработка определенных колонок с помощью функции (
gsub
); - "Печатать" (вывод) определенных колонок.
Шаблоны:
awk -F=$'\n' ' { print NF; }' # NF - количество строк
Вся команда awk заключается в одинарные кавычки. В фигурные скобки заключаются { действия; }
. И разделитель и filter колонок могут принимать регулярное выражение regex.
Опции:
awk -F "\n" 'program' # разделитель входных полей
awk '{ OFS=":";}' # разделитель выходных полей
awk '{ FS="[ :];}' # разделитель выходных полей (regexp)
Важно!
В awk нет возможности использовать tr или seed для замены и удаления подстрок. Но есть утилита gsub:
awk '/regexp/ { gsub('search', 'replace', $1); print $1 $2; }'
Предопределенные переменные:
NR номер текущей строки
NF число колонок в текущей строке
RS разделитель строк на вводе "\0"
FS разделитель полей на вводе
ORS разделитель строк на выводе RS
OFS разделитель полей на выводе FS
OFMT формат вывода чиcла "%.6g"
FILENAME имя входного файла
Часто используемые встроенные ф-ции:
length($1) длина строки
substr($1, m, n) подстрока n символов начиная с m
Примеры
Парсинг параметров Propel2 основаный на Symfony Console:
vendor/bin/propel --no-ansi | sed "1,/Available commands:/d" | awk -F" +" '/^ [a-z]+/ { gsub("^ +","",$1); gsub(":","\:",$1); print $1 ":" $2 }'
Распечатать первое вхождение в регулярку:
echo " string" | awk '/^[ ]+[a-z]+/ { print $1 }'
Синтаксис и пример подстановки переменной:
$'"${var}"' # Например: awk '{ print $'"${1}"' }'
Экранировать двоеточие в строке:
str='a:b';
${str//[:]/\\:}
Пример обработки колонок awk на выходе:
awk { print "\\x"toupper(substr($1,3,4)) }
#awk, #regexp, #bash