AWK(1)
НАЗВАНИЕ
awk - сопоставление с шаблонами и преобразование текста
СИНТАКСИС
awk [-Fсимвол] [[-f] программа] [аргумент ...] [файл ...]
ОПИСАНИЕ
Команда awk сопоставляет строки исходных файлов с шаблонами, определенными в программе. Шаблоны можно задать
либо непосредственно в командной строке, либо поместить
в файл с именем программа и воспользоваться опцией -f.
Если шаблоны указаны в командной строке, их следует
заключить в одинарные кавычки ('), чтобы избежать интерпретации shell'ом.
Команде awk могут быть переданы аргументы в виде x=...
y=... и т.д. (см. ПРИМЕРЫ).
Файлы читаются в том порядке, как они заданы. Если не
указано ни одного файла или задано имя -, используется
стандартный ввод. Ввод для awk делится на записи, разделяемые специальным символом. По умолчанию это перевод
строки; в таком случае awk обрабатывает ввод построчно.
Разделитель записей можно изменить, переопределив переменную RS. Каждая запись делится на поля, ограниченные
разделителями полей (по умолчанию - пробелами). Этот
разделитель можно изменить, переопределив переменную FS
или указав флаг -Fсимвол. Поля исходных строк доступны
по именам $1, $2,...; $0 - вся входная строка.
Для каждого шаблона из программы может быть задано действие, которое будет произведено со всякой строкой, успешно сопоставленной с шаблоном. Оператор шаблон-действие имеет вид:
шаблон { действие }
Каждая исходная строка сопоставляется с каждым из шаблонов; в случае успеха выполняются указанные действия.
После сопоставления со всеми шаблонами вводится следующая строка и процесс сопоставления повторяется. Может
быть опущен либо шаблон, либо действие, но не оба вместе. Если для данного шаблона не указаны действия, то
строка просто копируется на стандартный вывод. Если для
действия не определен шаблон, то оно будет выполняться
для каждой входной строки. Строки, которые не удалось
сопоставить ни одному шаблону, игнорируются.
Действие есть последовательность операторов. Так как
шаблоны и действия могут быть опущены, то, чтобы различать их в программе, последние надо брать в фигурные
скобки. Оператор есть одна из конструкций:
if ( условие ) оператор [ else оператор ]
while ( условие ) оператор
for ( выражение; условие; выражение ) оператор
break
continue
{ [ оператор ] ... }
переменная = выражение
print [ список_выражений ] [> выражение ]
printf формат [, список_выражений ] [> выражение ]
next # пропустить оставшиеся шаблоны и перейти к
следующей строке
exit # пропустить оставшиеся строки
Операторы завершаются точкой с запятой, переводом строки или правой скобкой. Пустой список_выражений означает
всю строку. Выражения строятся из цепочек символов и
чисел с помощью операций +, -, *, /, % и конкатенации
(обозначается пробелом). В выражениях также можно использовать операции из языка C: ++, --, +=, -=, *=, /=,
%=. Переменные инициализируются пустыми цепочками. Переменные могут быть скалярами, элементами массива
(обозначается x[i]) или полями. Индексами массива могут
служить любые (не обязательно числовые) цепочки символов, что позволяет реализовать разновидность ассоциативной памяти. Цепочки символов заключаются в двойные
кавычки (").
Оператор print выдает свои аргументы на стандартный вывод (или в файл, если присутствует часть >выражение),
разделяя их текущим разделителем полей и завершая каждую запись выходным разделителем записей. Оператор
printf делает то же самое, но под управлением формата
[см. printf(3S)].
Встроенная функция length возвращает длину своего аргумента, рассматривая его как цепочку символов; если аргумент опущен, то возвращается длина текущей строки.
Определены также следующие встроенные функции: exp,
log, sqrt и int (int отбрасывает дробную часть своего
аргумента). Функция substr(s, m, n) возвращает n-символьную подцепочку цепочки s, начинающуюся с позиции m.
Функция sprintf(формат, выражение, выражение,...) преобразует выражения в соответствии с указанным форматом
[см. printf(3S)] и возвращает полученную цепочку символов.
Шаблон - это произвольная логическая комбинация, составленная с помощью операций !, ||, && и скобок из регулярных выражений и выражений сравнения. Регулярные
выражения обрамляются символами / [подробнее см.
egrep(1)]. Отдельное регулярное выражение в шаблоне сопоставляется со всей строкой. Регулярные выражения могут входить и в выражения сравнения. Шаблон может состоять из двух шаблонов, разделенных запятой; при этом
указанные действия выполняются для всех строк между
строкой, удовлетворяющей первому шаблону, и строкой,
удовлетворяющей второму шаблону.
Выражение сравнения - это одна из следующих конструкций:
выражение опер_сопост регулярное_выражение
выражение опер_сравн выражение
где опер_сравн - любая из шести операций сравнения языка C, опер_сопост это ~ (содержится) или !~ (не содержится).
Условие - это арифметическое выражение, выражение сравнения или их логическая комбинация.
Для выполнения каких-либо действий перед первой или
после последней строки определены специальные шаблоны
BEGIN и END. BEGIN должен быть первым шаблоном, END
- последним. Например, для использования символа c в
качестве разделителя полей можно либо запустить программу с опцией -Fc, либо указать
BEGIN { FS = c }
Остальные специальные переменные:
- NF
- Количество полей в текущей записи.
- NR
- Порядковый номер текущей записи.
- FILENAME
- Имя файла, из которого в данный момент производится ввод.
- OFS
- Разделитель полей при выводе, по умолчанию пробел.
- ORS
- Разделитель записей при выводе, по умолчанию перевод строки.
- OFMT Формат вывода чисел, по умолчанию %.6g.
ПРИМЕРЫ
- Вывести строки файла f1, содержащие более 72 символов:
awk 'length > 72' f1
- Вывести первые два поля файла f2 в обратном порядке:
awk '{ print $2, $1 }' f2
- Сложить числа, стоящие в первом столбце файла f3,
вывести сумму и среднее арифметическое:
В файле prog:
{ s += $1 }
END { print "sum is", s, " average is", s/NR }
Командная строка:
awk -f prog f3
- Вывести поля файла f4 в обратном порядке:
awk '{ for (i = NF; i > 0; --i) print $i }' f4
- Вывести все строки файла f5, находящиеся между парами start/stop
awk '/start/,/stop/' f5
- Вывести те строки файла f6, у которых первое поле не
совпадает с первым полем предыдущей строки:
awk '$1 != prev { print; prev = $1 }' f6
- Распечатать файл f7, вставляя после слова "Page" номер страниц, начиная с пятой:
В файле prog:
/Page/ { $2 = n++ }
{ print }
Командная строка:
awk -f prog n=5 f7
СМ. ТАКЖЕ
egrep(1), lex(1), sed(1).
printf(3S) в Справочнике программиста.
СЮРПРИЗЫ
Входные пробелы не сохраняются при выводе, если поля
этой записи подвергались изменениям.
В языке команды awk отсутствуют явные преобразования
между цепочками символов и числами. Чтобы выражение
трактовалось как число, прибавьте к нему 0; чтобы трактовалось как цепочка - сконкатенируйте его с пустой цепочкой ""