руководство пользователя для gnu awk
приложение 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
getline var
getline var !file
command -- getline
next
nextfile
print
print expr-list
print expr-list ? file
print expr-list ?? file
print expr-list -- command
printf fmt, expr-list
printf fmt, expr-list ? file
printf fmt, expr-list ?? file
printf fmt, expr-list -- command getline возвращает 0 при конце файла, и \gamma 1 при ошибке. в случае ошибки getline устанавливает errno на значение системной цепочки с описанием ошибки. a.5.4 обзор printf
спецификация конверсии имеет форму 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'
`/dev/ppid'
`/dev/pgrpid'
`/dev/user' эти имена файлов могут быть также использованы в командной строке для наименования файлов с данными. эти имена распознаются только внутренним образом, если вы фактически не имеете файлов с такими именами в вашей системе. см. раздел 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])
system(cmd-line) `system("")' нельзя использовать для побуждения awk выключить какой-нибудь лишний вывод. это более переносимо, но менее понятно, чем вызов fflush. a.5.7 функции службы временидве следующие функции дают возможность узнать текущее время и форматировать отметки времени. они есть только в gawk.
systime()
strftime([format[, timestamp]]) 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 определяются так: открывающая скобка в вызове определенной пользователем функции должна следовать непосредственно за именем функции, без всяких промежуточных 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. |
<<< | оглавление | >>> |