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 <file | установить $0 из следующей записи файла; установить NF
|
getline var | установить var из следующей вводной записи; установить NR, FNR
|
getline var <file | установить 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) { statement }
function name(parameter list) { statement }
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] == "") ...
приводит к тому, что он появляется со значением "".
Назад | Содержание | Вперед