10.27. Итоговое краткое описание awk Командная строка
awk programm filenames awk -f programm-file filenames awk -Fs sets field separator to string s awk -Ft sets separator to tab
Шаблоны
BEGIN END /regular expression/ relational expression pattern && pattern pattern || pattern (pattern) !pattern pattern, pattern
Операторы управления потоком
if (expr) statement [else statement] if (subscript in array) statement [else statement] while (expr) statement for (expr; expr; expr) statement for (var in array) statement do statement while statement break cintinue next exit [expr] return [expr]
Ввод-вывод
close (filename)
закрыть файл
getline
установить $0 из следующей вводной записи; установить NF, NR, FNR
getline
установить $0 из следующей записи файла; установить NF
getline var
установить var из следующей вводной записи; установить NR, FNR
getline var
установить var из следующей записи файла
print
распечатать текущую запись
print expr-list
распечатать выражение
print expr-list >file
печать выражений в файл
printf fmt, expr-list
отформатировать и распечатать
printf fmt, expr-list >file
отформатировать и распечатать в файл
system (cmd-line)
выполнить команду cmd-line, возвратить состояние
В print и printf >>file добавляется в file и |command - записывает в канал.
Функции
func name(parameter list) function name(parameter list) function-name(expr, expr, ...)
Функции строки
gsub(r,s,t)
заменить строку s для каждого найденного регулярного выражения r в строке t; возвращает количество замен; если t опущено, то используется $0
index(s,t)
возвращает индекс строки t в строке s, или 0, если нет вхождений строки t
length(s)
возвращает длину строки s
match(s,r)
возвращает позицию s, в которой встретилось регулярное выражение r; возвращает 0, если r не найдено
split(s,a,r)
разбить строку s в массив a по регулярному выражению r; возвращает количество полей; если r опущено, то используется значение FS
sprints(fmt,expr-list)
печатает expr-list в соответствии с fmt, возвращает результирующую строку
sub(r,s,t)
аналогично gsub, за исключением того, что заменяется только первая найденная подстрока
substr(s,i,n)
возвращает подстроку n, начинающуюся с i; если n опущено, то используется остаток s
Арифметические функции
atan2(y,x)
арктангенс y/x в пределах от "-пи" до "пи"
cos(x)
косинус x
exp(x)
экспоненциальная функция x
int(x)
целая часть x с усеченными лидирующими нулями
log(x)
натуральный логарифм x
rang()
случайное число между 0 и 1
sin(x)
синус x
sqrt(x)
квадрат x
srand(x)
x - новое начальное значение для rand()
Операторы
= += -= *= /= %= ^=
присвоение
?:
условное выражение
||
логическое OR
&&
логическое AND
~ !~
поиск регулярного выражения; отрицательный поиск
< <= > >= != ==
отношения
blank
конкатенация строк
+ -
сложить, вычесть
* / %
умножить, разделить, режим
+ - !
унарный плюс, унарный минус, логическое отрицание
^
показательная функция ( ** является синонимом)
++ --
приращение, отрицательное приращение
$
поле
Регулярные выражения
с
поиск на совпадение с немета-символом "c"
\с
поиск буквенного символа "с"
^
поиск начала строки или последовательности строк
$
поиск конца строки или последовательности строк
.
поиск любого символа, кроме символа новой строки
[s]
поиск любого символа из набора "s"
[^s]
поиск любого символа, отличного от "s" и символа новой строки
r*
поиск ноль или больше
r+
поиск одного или больше
r?
поиск ноль или один
(r)
группирование: поиск r
r1r2
конкатенация: поиск r1 затем r2
r1|r2
поиск либо r1 либо r2
Встроенные переменные
ARGC
число аргументов командной строки
ARGV
массив аргументов командной строки
FILENAME
имя текущего вводного файла
FNR
номер записи в текущем файле
FS
разделитель поля вводного файла; (по умолчанию - пробел)
FN
число полей в текущей записи
NR
число считанных на данный момент записей
OFMT
выводной формат для цифр; (по умолчанию - %6.g)
OFS
разделитель поля выводного файла
ORS
разделитель записи выводного поля
RS
разделитель записи вводного файла
RSTART
индекс первого выбранного символа при помощи match(); 0 - если символ не найден
RLENGTH
длина строки, выбранной при помощи match() -1 - если строка не найдена
SUBSEP
разделитель индексов элементов массива; (по умолчанию - \034)
10.27.1. Ограничения
При работе с awk вы должны придерживаться следующих ограничений:
100
полей
2500
символов во вводной записи
2500
символов в выводной записи
1024
символов в индивидуальном поле
1024
символов в строке printf
400
символов в строке, заключенной в кавычки
400
символов в классе символов
15
открытых файлов
1
канал
10.27.2. Инициализация, сравнение и тип приведения
Каждые переменная или поле могут потенциально быть строкой или числом, либо состоять из того и другого. Когда значение переменной устанавливается при присвоении:
var = expr
то тип переменной определяется выражением. В арифметических выражениях тип - цифровой, в конкатенации - строковый, и т.д. Если назначение является простым копированием:
v1 = v2
то типом v1 становится тип v2. При сравнении, если оба операнда являются цифровыми, то производится цифровое сравнение. В противном случае, операнды рассматриваются как строковые и сравнение производится над строками. Тип любого выражения может быть приведен к цифровому таким образом:
expr + 0
и к строковому типу:
expr ""
(это конкатенация с пустой строкой)
Инициализированные переменные имеют цифровое значение 0, а строковые - значение "". Соответственно, если x проинициализировано, то оператор
if (x) ... имеет значение "ложь", а
if (!x) ... if (x == 0) ... if (x == "") ... все являются истиной, но
if (x == "0") ... является ложью.
Тип поля определяется по контексту. Например:
$1++ означает, что $1 будет цифровым, и
$1 = $1 "," $2
означает, что и $1 и $2 являются строковыми. Приведение к типу выполняется при необходимости.
Если по контексту тип не может быть определен, например:
if ($1 == $2) ...
тип поля определяется при вводе.
Поля, которые являются нулевыми, имеют строки со значением "", они не являются цифровыми.
Определения типов для элементов массива, созданных split(), аналогичны определению типов для полей.
Так, если arr[i] не существует, то :
if (arr[i]
== "") ...
приводит к тому, что он появляется со значением "".