Руководство пользователя для GNU Awk

Arnold D. Robbins
перевод Балуева А. Н.

Оглавление

Приложение A. Обзор gawk

A.5 Действия

В начало страницы

Операторы действий заключаются в скобки `-' и `""'. Отсутствие действий эквивалентно `- print ""'.

Операторами действий могут быть операторы присваивания, условные операторы, операторы циклов, операторы ввода/вывода и другие операторы , имеющиеся в Си и других языках.

Комментарии начинаются с символа `#'и продолжаются до конца строки. Для разделения операторов могут использоваться пустые строки. Нормально операторы заканчиваются символом newline; однако, это не так в случае строк, оканчивающихся на `,', `-', `?', `:', `&&', or `----'. Строки, оканчивающиеся на do или else также автоматически продолжают их операторы на следующую строку. В других случаях строка может быть продолжена знаком `"', и в этом случае newline игнорируется.

Несколько операторов могут располагаться в одной строке, разделенные знаком `;'. Это применимо как к операторам внутри действия в правиле (обычный случай), так и к самим операторам правил. См. раздел 2.2.5 [Комментарии в awk-программах], стр. 13, для информации об комментариях в awk. Описание механизма продолжения строк см. в разделе 2.6 [Операторы awk и строки], стр. 17.

A.5.1 Операторы

В начало страницы
Операции в awk, в порядке уменьшения приоритета, следующие:
(...) Группировка. 
$ Ссылка на поле. 
++ -- Увеличение и уменьшение,
как префиксные, так и постфиксные. 
^ Возведение в степень 
(`**' также можно употреблять, и  `**=' 
для операторов присваивания, но они не указаны в
POSIX standard). 
+ - ! Унарные  плюс и минус и логическое отрицание.
* / % Умножение, деление и модулю. 
+ - Сложение и вычитание.
пробел  конкатенация цепочек. 
! != ? ?= != ==  Обычные операции отношения.
 ~ !~ Соответствие регулярному выражению, отрицание соответствия.
in Принадлежность массиву.
 && Логическое "и". 
 ---- Логическое  "или".
?: Условное выражение. 

Имеет формат `expr1 ? expr2 : expr3'. Если expr1 есть true, значение выражения есть expr2; в противном случае expr3. Вычисляется только одно из expr2 и expr3.

= += -= *= /= %= ^= Присваивания. Поддерживаются абсолютное присваивание (var=value) и операционные присваивания (все остальные формы) См. главу 7 [Выражения], стр. 77.

A.5.2 Управляющие операторы

В начало страницы
К управляющим операторам относятся:
if (condition) statement [ else statement ]
while (condition) statement do statement while (condition)
for (expr1; expr2; expr3) statement
for (var in array) statement
break
continue
delete array[index]
delete array
exit [ expression ] - statements ""
См. главу 9 [Управляющие операторы в действиях], стр. 105.

A.5.3 Операторы ввода/вывода

В начало страницы

Операторы ввода/вывода: getline; установка $0 из очередной входной записи; установка NF, NR, FNR. См. раздел 5.8 [Явный ввод по getline], стр. 53.

getline !file
Устанавливает $0 по следующей записи в файле; устанавливает NF.

getline var
Устанавливает в var следующую входную запись; устанавливает NR, FNR.

getline var !file
Устанавливает в var следующую запись из file.

command -- getline
Выполнить command, передающую свой выход по конвейеру в getline; устанавливает $0, NF, NR. command -- getline var Выполнить command, передающую по конвейеру свой выход в getline; устанавливает var.

next
Останавливает обработку текущей входной записи. Читается следующая входная запись и обработка продолжается, начиная с первого образца в программе.

nextfile
Прекращается обработка текущего входного файла. Следующая входная запись читается из следующего входного файла. FILENAME обновляется, FNR устанавливается на 1, ARGIND увеличивается и обработка начинается с первого образца программы. Если достигнут конец входных данных, выполняются (если есть) правила END . В ранних версиях gawk использовался `next file'; это еще поддерживается и теперь, но рассматривается его исключение. См. раздел 9.8 [Оператор nextfile], стр. 112.

print
Печать текущей записи. См. главу 6 [Печать вывода], стр. 61.

print expr-list
Печатается указанный список выражений

print expr-list ? file
Напечатать в file значения указанных выражений. Если файла нет, он создается. Если он существует, то очищается перед печатью.

print expr-list ?? file
Напечатать значения выражений в file. Прежнее значение файла сохраняется, печать дописывается в файл.

print expr-list -- command
Напечатать выражения, послав результат по конвейеру в command. Конвейер к команде остается открытым до вызова функции close.

printf fmt, expr-list
Форматирование и печать.

printf fmt, expr-list ? file
Форматирование и печать в file. Если файла нет, он создается. Если существует, то очищается перед печатью.

printf fmt, expr-list ?? file
Форматирование и печать в file. Прежнее значение в файле сохраняется, новое дописывается в конец.

printf fmt, expr-list -- command
Форматирование и печать, результат посылается по конвейеру к command. Конвейер к command остается открытым до вызова close.

getline возвращает 0 при конце файла, и \Gamma 1 при ошибке. В случае ошибки getline устанавливает ERRNO на значение системной цепочки с описанием ошибки.

A.5.4 Обзор printf

В начало страницы

Спецификация конверсии имеет форму
%[flag][width][.prec]format. Объекты в квадратных скобках не обязательны.

awk-оператор printf и функция sprintf воспринимают следующие спецификации форматов конверсии:

%c Знаки ASCII. Если аргумент, используемый для `%c' есть цифра, она рассматривается как символ и печатается. В противном случае аргумент предполагается цепочкой и печатается только первый символ цепочки.

%d %i Десятичное число (целая часть).

%e %E Число с плавающей точкой вида `[-]d.dddddde[+-]dd'. Формат `%E' использует `E' вместо `e'.

%f Число с плавающей точкой вида [-]ddd.dddddd.

%g %G Использовать форматы `%e' или `%f', тот, у которого результат короче, с подавлением незначащих нулей.

`%G' использует `%E' вместо `%e'.

%o Восьмеричное без знака (целое).

%s Цепочка символов.

%x %X Шестнадцатеричное число без знака (целое). Формат `%X' использует буквы от A' до `F' вместо от `a' до `f' для десятичных от 10 до 15.

%% Один символ `%'; никакие аргументы не конвертируются.

Имеются необязательные, дополнительные параметры, которые могут помещаться между `%' и управляющей буквой:

- Выражение смещено влево на своем поле.

пробел при преобразования чисел предварять пробелом положительные числа, а отрицательные знаком минус.

+ Знак плюс, используется перед модификатором ширины (см. ниже), предписывает всегда снабжать числа знаком, даже если форматируемые данные положительны. `+' подавляет модификатор-пробел.

# Использовать "альтернативную форму" для некоторых управляющих букв. При `o', писать ведущие нули. При `x' и `X' писать ведущие `0x' или `0X' в ненулевых результатах. При `e', `E' и `f', результат всегда будет содержать десятичную точку. При `g'и `G', заключительные нули не удаляются из результата.

0 Ведущий `0' (ноль) действует как флажок, показывающий, что вывод должен пополняться нулями вместо пробелов. Это применяется даже к нечисловым выходным форматам. Этот флажок действует только когда ширина поля больше длины печатаемого значения.

width Поле должно быть расширено до указанной ширины. Нормально поле пополняется пробелами. Если использован флажок `0', оно пополняется нулями.

.prec Число, которое указывает точность, используемую при печати. Для форматов `e', `E' и `f' оно указывает количество знаков, которое вы хотите печатать справа от десятичной точки. Для форматов `g' и `G' оно указывает максимальное количество значащих цифр. Для форматов `d', `o', `i', `u', `x' и `X' оно указывает минимальное количество печатаемых цифр. Для формата `s' оно указывает максимальное количество знаков от цепочки, которые должны быть напечатаны.

Любое из двух или обе величины, width и prec, могут быть указаны как `*'. В таком случае значение берется из списка аргументов. См. раздел 6.5 [Использование операторов printf для декоративной печати], стр. 64.

A.5.5 Специальные файловые имена

В начало страницы

При перенаправлении ввода/вывода от print или printf в файл или через getline от файла gawk распознает некоторые специальные файловые имена. Эти имена разрешают доступ к дескрипторам открытых файлов, унаследованных от родительских процессов gawk (обычно от оболочки).

Имена следующие:

`/dev/stdin'  Стандартный ввод
`/dev/stdout' Стандартный вывод
`/dev/stderr' Стандартный вывод для ошибок
`/dev/fd/n'   Файл, обозначенный открытым файловым дескриптором  n.

Кроме того, чтение следующих файлов обеспечивает информацию о процессе выполнения программ gawk. Все выдаваемые записи кончаются символом newline.

`/dev/pid'
Выдает идентификатор ID текущего процесса

`/dev/ppid'
Выдает ID родителя текущего процесса.

`/dev/pgrpid'
Выдает ID группы процессов для текущего процесса.

`/dev/user'
По крайней мере четыре разделенных пробелами поля, содержащие возвращенные значения системных вызовов getuid, geteuid, getgid и getegid. Если имеются дополнительные поля, они представляют групповые ID, возвращенные системным вызовом getgroups. (Кратные группы могут не поддерживаться во всех системах.)

Эти имена файлов могут быть также использованы в командной строке для наименования файлов с данными. Эти имена распознаются только внутренним образом, если вы фактически не имеете файлов с такими именами в вашей системе. См. раздел 6.7 [Специальные имена файлов в gawk], стр. 72, с подробными описаниями, поясняющими мотивацию упомянутых средств.

A.5.6 Встроенные функции

В начало страницы

awk предоставляет некоторое множество встроенных функций для проведения вычислений, операций над цепочками и операций ввода/вывода.

Встроенные арифметические функции:

atan2(y, x)
арктангенс  y/x в радианах.

cos(expr)
косинус выражения в радианах.

exp(expr)
экспоненциальная функция (e ^ expr).

int(expr)
округление до целого.

log(expr)
натуральный логарифм от expr.

rand()
случайное число между 0 и 1.

sin(expr)
sin от  expr в радианах.

sqrt(expr)
квадратный корень.

srand([expr])
использует expr как новое начало 
для генератора псевдослучайных чисел.
При отсутствии expr используется время дня. 
Возвращает значение предшествующего
начала генератора.

awk имеет следующие встроенные функции для операций над цепочками:

gensub(regex, subst, how [, target])

Если how есть цепочка, начинающаяся с `g' или `G', то функция замещает на subst каждое вхождение соответствия regex в target. В противном случае замещаются вхождения how. Если target отсутствует, используется $0. Возвращаемое значение есть измененная цепочка; исходная target не меняется. Внутри subst, `"n', где n есть цифра от 1 до 9, может использоваться для указания текста, который соответствует n-му заключенному в скобки подвыражению. Эта функция есть особенность gawk.

gsub(regex, subst [, target])

На место каждой подцепочки цепочки target, отвечающей регулярному выражению regex, подставляется цепочка subst, возвращается количество сделанных подстановок. Если target отсутствует, вместо нее используется $0.

index(str, search)
возвращается индекс цепочки search в цепочке str, 
или 0, если  search не
присутствует.

length([str])
возвращает длину цепочки  str. 
Возвращается длина  $0, если аргумент
отсутствует.

match(str, regex)
Возвращает позицию в str, 
где оказывается регулярное выражение regex, или
0, если  regex отсутствует, 
и устанавливает значения  RSTART и RLENGTH.

split(str, arr [, regex])

разделяет цепочку str в массив  
arr согласно регулярному выражению regex,
возвращает количество элементов. 
Если regex опущено, вместо него используется
FS. 
regex может быть пустой цепочкой, 
что заставляет каждый символ помещаться
в отдельном элементе. 
Массив arr предварительно очищается.

sprintf(fmt, expr-list)
печать списка expr-list соответственно  fmt, 
возвращает цепочку-результат.

sub(regex, subst [, target])
действует подобно gsub, но замещается 
только первая соответствующая подцепочка.

substr(str, index [, len])

Возвращает подцепочку длины len цепочки  str, 
начинающуюся с позиции index.
Если len опущено, используется весь остаток  str.

tolower(str)
возвращает копию str, в которой 
буквы верхнего регистра заменены нижними.
Не буквы остаются без изменения.

toupper(str)
возвращает копию  str, где буквы 
нижнего регистра заменены но верхние.
Не буквы не меняются.


К функциям ввода/вывода относятся:

close(expr)
закрыть открытый файл или конвейер с именем  expr.

fflush([expr])
Выключить всякий буферизованный вывод для выходного файла или конвейера, обозначенного expr. Если expr отсутствует, выключается стандартный вывод. Если expr есть пустая цепочка (""), выключаются все выходные буферы.

system(cmd-line)
выполнить команду cmd-line и возвратить статус exit. Если операционная система не поддерживает system, произойдет фатальная ошибка.

`system("")' нельзя использовать для побуждения awk выключить какой-нибудь лишний вывод. Это более переносимо, но менее понятно, чем вызов fflush.

A.5.7 Функции службы времени

В начало страницы

Две следующие функции дают возможность узнать текущее время и форматировать отметки времени. Они есть только в gawk.

systime()
Возвращает время даты в виде количества секунд, прошедших с полночи 1 Января 1970 (UTC, на системах POSIX).

strftime([format[, timestamp]])
Форматирует отметку времени согласно спецификации format. Использует текущее время, если timestamp опущена. По умолчанию format эквивалентен выходу в утилите date. См. Раздел 12.5 [Функции для действий с отметками времени], стр. 148, содержащий подробное описание спецификаций формата в strftime. См. также главу 12 [Встроенные функции], стр. 135, с описанием всех встроенных функций в awk.

A.5.8 Строковые константы

В начало страницы

Строковые константы в awk есть цепочки символов, заключенные в двойные кавычки ("). Внутри цепочек распознаются некоторые управляющие последовательности, как в Си. Вот эти последовательности:

""  Буквальный обратный слеш.
"a  Символ  "внимание"; обычно символ BEL в коде ASCII.
"b Backspace.
"f Formfeed (прогон страницы).
"n Newline.
"r Carriage return (возврат каретки).
"t Horizontal tab.
"v Vertical tab.
"xhex digits

Символы, представляющие цепочку шестнадцатеричных цифр, следуют за `"x'. Как и в ANSI C, все следующие шестнадцатеричные цифры рассматриваются как часть управляющей последовательности. Например, ""x1B" есть цепочка, содержащая ASCII ESC (escape) символ. (Управляющая последовательность `"x' не входит в POSIX awk.)

"ddd Символ, представленный одним, двумя или тремя восьмеричными цифрами. Так, ""033" есть цепочка, содержащая ASCII ESC (escape) символ.

"c Литерал c, если c не совпадает ни с одним из перечисленных выше знаков. Управляющая последовательность может также использоваться внутри постоянных регулярных выражений (например, regexp /[ "t"f"n"r"v]/ соответствует символам whitespace). См раздел 4.2 [Управляющие последовательности], стр. 24.

A.6 Функции, определенные пользователем

В начало страницы

Функции в awk определяются так:
function name(parameter list) - statements ""

Фактические параметры (аргументы) в вызове функции используются для представления формальных параметров, объявленных в определении функции. Массивы передаются по имени (ссылке), другие параметры передаются по значению. Если передается меньше аргументов, чем имеется параметров в списке, лишним параметрам присваиваются пустые значения. Лишние параметры используются как локальные переменные.

Открывающая скобка в вызове определенной пользователем функции должна следовать непосредственно за именем функции, без всяких промежуточных whitespace. Это необходимо для избежания синтаксических неясностей с операциями конкатенации. Слово func может быть использовано вместо слова function (но не в POSIX awk).

Для возврата значения вызовом нужно использовать оператор return. См. главу 13 [Функции, определенные пользователем], стр. 153.

A.7 Историческая справка

В начало страницы

Имеются две особенности исторической реализации awk, которые поддерживает gawk.

Во-первых, можно вызывать встроенную функцию length не только без аргументов, но даже и без скобок!

a = length есть то же самое, что и
a = length() или  a = length($0)

Например:

$ echo abcdef -- awk '- print length ""'
a 6

Эта конструкция помечена как "устаревшая" в POSIX standard, и gawk выдаст предостережение об ее использовании, если в командной строке указано `--lint'. (Возможность использовать length таким способом была фактически случайной в оригинальной реализации Unix awk. Если какая-нибудь встроенная функция использует $0 как аргумент по умолчанию, было возможно вызывать эту функцию без скобок. В частности, было обычной практикой использовать функцию length таким образом, и эта возможность была задокументирована в руководстве awk manual page.)

Другая историческая особенности есть употребление операторов break или continue вне тела while, for или do цикла. Традиционно реализации awk рассматривали такое употребление как эквивалент оператора next. Последние версии Unix awk этого не допускают. gawk поддерживает такое использование, если в командной строке указано `--traditional'. См. раздел 14.1 [Параметры командной строки], стр.161, по поводу информации о параметрах `--posix' и `--lint' options.

В начало страницы

<<< Оглавление Страница: Приложение A  Приложение B. >>>