https://www.lissyara.su/doc/man/awk/

www.lissyara.su —> документация —> man —> awk

awk man
Автор: Andy.

Имя

awk - шаблонно направленый язык просмотра и обработки

Сценарий

awk [ -F [fs ] [ -v var=value ] [ 'prog' | -fprogfile ] [file ...]

Описание

Awk сканирует каждый входной файл на строки совпадающие с заданными шаблонами определенных в progr, или в одном или нескольких файлах, определенных ключом -f progfile. К каждому шаблону может быть привязано действие, которое будет выполнено, когда строка файла соответствует образцу. Каждая строка, совпадающая с частью шаблона, каждого состояние выполнения по шаблону; привязанное действие выполняется для каждого совпавшего шаблона.Имя файла - означает стандартный ввод. Любой файл формы var=value, рассматривается как привязка, а не как имя файла, и запускается во время открытия как если бы это было имя файла. Опция -v сопровождаемая var=value, привязка выполняемая перед запуском prog; любое количество вариантов опции -v может быть задано. Опция -Ffs определяет разделитель поля ввода регулярного выражения.

Строка ввода обычно содержит поля, разделенные пробелом (white space), либо регулярным выражением FS. Поля обозначаются как $1, $2, а $0 означает целую строку. Если FS не определен, входная строка разделяется на одно поле на символ.

Состояние выполнения по шаблону имеет форму

pattern { action }

Пропущенный { action }, означает печать строки; пропущеная строка всегда совпадает. Состояние выполнения по шаблону разделены символом новой строки
или двоеточием.

Действие - это последовательность состояний. Состояние может быть одним из следующих:

if( expression ) statement [ else statement ]
while( expression ) statement
for( expression ; expression ; expression ) statement
for( var in array ) statement
do statement while( expression )
break
continue
{ [ statement ... ] }
expression              # обычно var = expression
print [ expression-list ] [ > expression ]
printf format [ , expression-list ] [ > expression ]
return [ expression ]
next                   # пропустить оставшиеся шаблоны на этой входной строке
nextfile               # пропустить остаток файла, открыть следующий, начать сначала
delete array[ expression ]# удалить элемент массива
delete array            # удалить все элементы массива
exit [ expression ]     # выйти незамедлительно; статус является выражением

Состояния закрываются двоеточиями, символами новой строки или правой квадратной скобкой. Пустая строка выражений начинается с $0. Строки содержащие символы цитирования " ", содержимое в них распознается как C последовательности. Выражения берут строку или числовое значение за соответствие и строятся с использованием операторов + - */ % ^(возведение в степень) и конкатенацию (обозначенную пробелом). Операторы  !  ++  — += -= *= /= %= ^= > >= < <= == != ?: так же могут являться выражениями. Переменные могут быть скалярными, элементами массива (обозначемыми x[i]) или полями. Переменные инициализируются с пустой строки.Приписки к массиву, могут быть любой строкой, не обязательно числовой; тем самым достигается поддержка формы ассоциативной памяти. Множественные приписки, такие как [i,j,k], допускаются; элементы связаны, разделяются значением SUBSEP.

Состояние print, печатает свои аргументы на стандартный вывод (или в файл, если
присутствуют >file или >>file, или в пайпе если присутствует |cmd), разделяемые текущим разделителем полей, и завершаемые разделителем выходной записи. file и cmd могут иметь буквенные имена или введенные выражения; идентичные строковые значения в разных состояниях обозначают тот же самый открытый файл. Состояние printf форматирует список выражений согласно формату (смотрите printf(3)). Встроенная функция close(expr), закрывают файл или пайп expr. Встроенная функция fflush(expr), очищает любой буферный выход для файла или пайпа expr.

Математические функции exp, log, sqrt, sin, cos, и atan2 встроены.
Другие встроенные функции:

length - длина аргумента взятая как строка, или $0 если нет аргумента.
random - случайный номер (0,1)
srand - устанавливает сид для rand и возвращает предыдущий сид.
int - усекает до значения целого числа
substr(s, m, n) - n-символьная подстрока s, которая начинается с позиции m, увеличиваясь на 1.
index(s, t) - позиция в s, где строка t появляется, или 0 если этого не происходит.
match(s, r) - позиция в s, где появляется регулярное выражение r, или 0 если этого не происходит. Переменные RSTAT и RLENGTH установлены на позицию и длину совпавшей строки.
split(s, a, fs) - разделяет строку s на массив элементов a[1], a[2], ... , a[n],
и возвращает n. Разделение осуществляется регулярным выражением fs, или разделителем полей FS, если fs не задан. Пустая строка, как разделитель, разделяет строку на
один массив элементов на строку.
sub(r, t, s) - подменяет t до первого появления регулярного выражения r или строки s. Если s не задано, $0 используется.
gsub - тоже самое, что и sub, за исключением того, что все возникающие регулярные выражения заменены; sub и gsub возвращают количество замен.
sprintf(fmt, expr, ...) - строка получившаяся из форматирования expr, согласно printf(3)[/brown] формату [color=green]fmt.
system(cmd) - запускает cmd и возвращает статус выхода.
tolower(str) - возвращает копию str где все символы верхнего регистра, изменены на соответствующие символы нижнего регистра.
toupper(str)[ - возвращает копию str где все символы нижнего регистра, изменены на соответствующие символы верхнего регистра.

``функция'' getline устанавливает $0 на следующую входную строку записанную из текущего файла;getline <file устанавливает $0 на следующую запись из файла. getline x устанавливает вместо этого переменную x. Наконец, cmd | getline переопределяет выходной cmd в getline; каждый вызов getline возвращает следующую строку из cmd. Во всех случаях, getline возвращает 1 для упешного ввода, 0 для конца файла, и -1 для ошибки.

Шаблоны - это произвольные булевы комбинации (с !||&&) регулярных выражений и
относительных выражений. Регулярные выражения такие же как и egrep (смотрите grep). Изолированые регулярные выражения в шаблоне, применяются для всей строки.
Регулярные выражения могут так же появлятся в относительных выражениях, используя оператор ~ и !~. /re/ - это константа регулярного выражения; любая строка (константа или переменная) может быть использована как регулярное выражение, исключая позицию изолированного регулярного выражения в шаблоне.

Шаблон может содержать два шаблона разделенных запятой; в таком случае действие
производится для всех строк появившегося первого шаблона, до возникновения второго.

Относительными выражениями являются одни из следующих:
expression matchop regular-expression
expression relop expression
expression[color=brown]in array-name
(expr,expr, ...) in array-name где relop один из шести относительных операторов в C, а matchop так же как ~ (совпадает) или !~ (не совпадает). Условно - это арифметическое выражение, относительное выражение, или булева комбинация двух выражений.

Специальные шаблоны BEGIN и END, могут использоваться для получения управления прежде, чем первая входная строка будет прочитана и после последней. BEGIN и END не сочитаются с другими шаблонами.

Имена переменных со специальными значениями:
CONVFMT - формат преобразования используемый при преобразовании чисел (по умолчанию %.6g)
FS - регулярное выражение используемое для разделения полей; так же устанавливается
опцией -Ffs.
NF - число полей в данной записи
NR - порядковый номер текущей записи
FNR - порядковый номер текущей записи в текущем файле
FILENAME - имя текущего входного файла
RS - разделитель входной записи (по умолчанию символ новой строки)
OFS - разделитель поля выходной записи (по умолчанию пусто)
ORS - разделитель выходной записи (по умолчанию символ новой строки)
OFMT - выходной формат чисел (по умолчанию %.6g)
SUBSEP - разделитель множественных приписок (по умолчанию 034)
ARGC - счетчик аргументов, назначаемый
ARGV - массив аргументов, назначаемый; не пустые члены берутся из фаловых имен
ENVIRON - массив окружения переменных; приписки являются именами

Функции могут быть определены (в позиции состояния выполнения по шаблону) как:
function foo(a, b, c) { ...; return x }
Параметры проходят по значению если скаляр и по ссылке, если массив; функции
могут быть вызваны рекурсивно. Параметры локальны к функции; все остальные
переменные являются глобальными. Таким образом, локальные переменные могут быть
созданы предоставлениям лишних параметров в определении функций.

Примеры

length($0) > 72
Печатает строку длинее 72 символов.
{ print $2, $1 }
Печатает первые два поля в обратном порядке.
BEGIN { FS = ",[ \t]*|[ \t]+" }
     { print $2, $1 }
То же самое с входными полями, разделенными запятой, и/или пустыми местами и
табуляцией.

    { s += $1 }
END  { print "sum is", s, " average is", s/NR }
Складывает первую колонку, печатает сумму и среднее число.

/start/, /stop/
печатает все строки между парами start/stop.

BEGIN     {    # симуляция echo(1)
           for (i = 1; i < ARGC; i++) printf "%s ", ARGV[i]
           printf "\n"
           exit }

Смотрите так же

lex(1), sed(1)
A.  V. Aho, B. W. Kernighan, P. J. Weinberger, The AWK Programming Language, Addison-Wesley, 1988.  ISBN 0-201-07981-X

Ошибки

Нет никаких явных преобразований между числами и строками. Для вызова выражения которое будет расценено как номер добавьте 0 к нему; для вызова выражения как строки добавте к нему "". Правила для переменных в функциях; оба ухудшают синтаксис.

размещено: 2007-08-24,
последнее обновление: 2007-08-25,
автор: Andy