awk в Linux

Категория: Bash

Утилита 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:

  1. Разделение каждой входящей строки на колонки (-F'delimiter'), по-умолчанию - пробел. Строка или регулярное выражение;
  2. Фильтрация входящей строки с помощью regex (filter). Строка или регулярное выражение;
  3. Обработка определенных колонок с помощью функции (gsub);
  4. "Печатать" (вывод) определенных колонок.

Шаблоны:

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

категория: Bash