<<< оглавление >>>

руководство пользователя для gnu awk

arnold d. robbins
перевод балуева а. н.

приложение a. обзор gawk

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

a.1 обзор параметров командной строки

командная строка содержит параметры самой gawk, программный текст awk (если не используется параметр `-f'), и значения для установки в предопределенных awk-переменных argc и argv:

gawk [posix or gnu style options] -f source-file [--] file ...
gawk [posix or gnu style options] [--] 'program' file ...

параметры, которые принимает gawk, следующие:

-f fs --разделитель полей fs

использовать fs как разделитель входных полей (значение предопределенной переменной fs).

-f program-file --файл с программой

читать исходную awk-программу из файла program-file, а не из первого аргумента командной строки.

-mf nnn -mr nnn флажок `f' определяет максимальное количество полей, а флажок `r'--- максимальный размер записи. gawk игнорирует эти параметры, так как он не имеет предопределенных пределов; они нужны только для совместимости с bell labs research версией unix awk.

-v var=val --присваивание assign var=val присвоить переменной var значение val до начала исполнения программы.

-w traditional -w compat --traditional --compat использовать режим совместимости, в котором расширения gawk не действуют.

-w copyleft -w copyright --copyleft --copyright

напечатать короткую версию общей публичной лицензии на стандартном выводе и прекратить выполнение программы. этот параметр может быть исключен из будущих версий gawk.

-w help -w usage --help --usage

напечатать короткий обзор доступных параметров стандартного вывода и прекратить работу.

-w lint --lint

выдавать предупреждения о сомнительных и непереносимых конструкциях awk.

-w lint-old --lint-old

предупреждать о конструкциях, которые недоступны в оригинальной версии awk 7 unix.

-w posix --posix

использовать posix-совместимый режим, в котором отсутствуют расширения gawk и применяются дополнительные ограничения.

-w re-interval --re-interval

допускаются интервальные выражения (см. раздел 4.3 [операторы регулярных выражений], стр. 26), в regexps.

-w source=program-text --исходный программный текст

использовать программный текст как исходный текст awk-программы. параметр позволяет смешивать код из командной строки с исходным кодом из файлов. это особенно полезно для смешивания программ в командной строке с библиотечными функциями.

-w version --версия

напечатать информацию о версии используемой копии gawk на выходе для ошибок.

-- сигнал о конце параметров. полезен для разрешения дальнейшим аргументам самой awk-программы начинаться с `-'. он нужен в основном для согласования с posix-конвенцией об анализе аргументов.

все остальные аргументы отмечаются как неверные и игнорируются. см. детали в разделе 14.1 [параметры командной строки], стр.161.

a.2 обзор языка

awk-программа состоит из последовательности 0 или более операторов формы образец-действие и необязательных определений функций. в операторах образец - действия либо образец либо действие могут отсутствовать:

pattern { action statements }
  ...
pattern { action statements }
function name(parameter list) { action statements }

gawk сначала читает исходную программу из программного файла или файлов, если таковые имеются, или из первого аргумента (не параметра) командной строки. параметр `-f' может быть использован в командной строке много раз. gawk читает программный текст из всех программных файлов, соединяя его части в порядке указания файлов. это полезно для построения библиотек awk-функций, позволяя не включать их в каждую новую awk-программу, которая их использует. чтобы воспользоваться библиотечной функцией в файле из программы, напечатанной в командной строке, нужно указать `--source 'program'' и впечатать вашу программу между простыми кавычками. см. раздел 14.1 [параметры командной строки], стр. 161.

переменная окружения awkpath содержит путь поиска для нахождения исходных файлов, указанных с параметром `-f'. по умолчанию используется путь `.:/usr/local/share/awk' *1*, если awkpath не установлен. если имя файла, указанного в параметре `-f', содержит символ `/',путь поиска не используется. см. раздел 14.3 [переменная окружения awkpath], стр. 166.

gawk компилирует программу во внутреннюю форму, и затем продолжает читать каждый файл, названный в массиве argv. начальные значения argv берутся из аргументов командной строки. если файлы в командной строке не указаны, gawk читает стандартный ввод.

если "file", названный в командной строке имеет форму `var=val', он рассматривается как присваивание переменной: переменная var получает значение val. если какой-нибудь из файлов имеет значение пустой строки, этот элемент в списке пропускается.

каждую запись во вводе gawk проверяет на соответствие всем образцам в awk-программе. для каждого образца, соответствующего записи, выполняется связанное с ним действие.

a.3 переменные и поля

переменные в awk не объявляются; они начинают существовать при первом их использовании. их значениями могут быть или числа с плавающей точкой, или цепочки.


1 путь может использовать каталоги, отличные от `/usr/local/share/awk', в зависимости от того, как gawk построен и установлен.


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

a.3.1 поля

как только очередная входная строка прочтена, gawk разделяет ее на поля, используя значение в переменной fs как разделитель полей. если fs есть один символ, поля разделяются этим символом. в противном случае ожидается, что fs есть полное регулярное выражение. в специальном случае, когда fs есть один пробел, поля разделяются группами пробелов, символов tab и/или символами newlin.*2* если fs есть пустая строка (""), то каждый отдельный символ в записи считается отдельным полем. заметим, что значение ignorecase (см. раздел 4.5 [чувствительность к регистру при соответствии], стр. 33) также влияет на то, как разделяются поля, если fs есть регулярное выражение.

на каждое поле введенной строки можно ссылаться по ее позиции, $1, $2, и т.д. $0 означает всю строку. значение поля можно также присваивать переменным. номера полей не обязательно константы:

n = 5 print $n

печатает пятое поле прочтенной строки. переменная nf имеет значение количества полей в введенной строке. ссылка на несуществующие поля (т.е. поля после $nf) дает пустое значение. однако, присваивание несуществующему полю (например, $(nf+2) = 5) увеличивает значение nf, создает дополнительные поля с пустым значением и пере вычисляет значение $0 с полями, разделенными значением ofs. уменьшение nf приводит к потере полей с номерами, большими чем новое значение и пере вычислению $0 с полями, разделенными значением ofs. см. главу 5 [чтение входных файлов], стр. 37.

a.3.2 встроенные переменные

gawk имеет следующие встроенные переменные: argc количество элементов в argv. (что такое argv, см. ниже).

argind индекс в argv текущего обработанного файла. когда gawk обрабатывает входные файлы с данными, то всегда выражение `filename == argv[argind]' имеет значение true.

argv массив аргументов командной строки. массив индексируется от 0 до argc \gamma 1. динамическое изменение argc


2 в posix awk newline не разделяет поля.


и содержимое argv могут управлять файлами с данными. элементы с пустыми значениями в argv игнорируются. argv не содержит параметров для awk или текста самой awk-программы.

convfmt формат конверсии, используемый при переводе чисел в цепочки.

fieldwidths разделенный пробелами список чисел, описывающий входные данные фиксированной ширины.

environ массив значений переменных окружения. массив индексирован именами переменных, каждый элемент имеет значение соответствующей переменной. так, переменная окружения home есть environ["home"]. одно из возможных значений может быть `/home/arnold'. изменения этого массива не воздействуют на окружение, видимое программами, которые порождает gawk через перенаправление или функцию system. (это может быть изменено в будущих версиях gawk.)

некоторые операционные системы не имеют переменных окружения. массив environ остается пустым при исполнении на таких системах.

errno системное сообщение об ошибке, когда происходит ошибка при использовании getline или close.

filename имя текущего входного файла. если в командной строке файлы не указаны, значение filename есть пустая цепочка.

fnr номер входной записи в текущем входном файле.

fs разделитель входных полей, по умолчанию пробел.

ignorecase флажок чувствительности к регистру для сравнения цепочек и операций с регулярными выражениями. если ignorecase имеет ненулевое значение, то при определении соответствия образцов в правилах, при разделении записей с rs, разделении полей с fs, в соответствиях регулярных выражений с `~' и `!~', в встроенных функциях gensub, gsub, index, match, split sub игнорируется регистр в операциях с регулярными выражениями и в сравнениях цепочек. значение ignorecase не влияет на индексирование массивов.

nf     количество полей в текущей входной записи.
nr     общее количество входных записей, обнаруженных к настоящему моменту.
ofmt   выходной формат чисел в операторах печати, "%.6g" по умолчанию.
ofs    разделитель выходных полей, пробел по умолчанию.
ors    разделитель выходных записей, newline по умолчанию.

rs разделитель входных записей, по умолчанию newline. если rs имеет значение пустой цепочки, то записи разделяются пустыми строками. если rs имеет значение пустой цепочки, то символ newline постоянно действует как разделитель полей, в дополнение к любому значению, которое может иметь fs. если rs получило значение много символьной цепочки, оно означает regexp; входной текст, соответствующий regexp, разделяет записи

rt входной текст, соответствующий тексту, обозначенному с помощью rs, разделитель записей.

rstart индекс первого символа в последнем соответствии; ноль, если соответствие не найдено.

rlength длина цепочки в последнем найденном соответствии; \gamma 1 если соответствия нет.

subsep цепочка, используемая для разделения кратных индексов в элементах массивов, по умолчанию "\034". см. главу 10 [встроенные переменные], стр. 115, о подробностях.

a.3.3 массивы

массивы индексируются выражениями в квадратных скобках (`[' и `]'). индексы массивов всегда цепочки; числа превращаются в цепочки, если нужно, по стандартным правилам конверсии (см. раздел 7.4 [конверсии цепочек и чисел], стр. 81).

если используются кратные индексы, т.е. выражения, разделенные запятыми, внутри квадратных скобок, то индекс элемента массива есть конкатенация значений отдельных индексов, превращенных в цепочки и разделенных разделителем индексов (значением subsep).

специальный оператор in может использоваться в условном контексте для определения того, есть ли в массиве элемент с данным индексом:

if (val in array)
print array[val]

если массив имеет кратные индексы, используйте `(i, j, ...) in array' для проверки, есть ли такой элемент в массиве.

конструкция in может также использоваться в цикле for для итераций по всем элементам массива. см. раздел 11.5 [сканирование всех элементов массива], стр. 127.

можно удалить элемент из массива с помощью оператора delete. можно очистить весь массив, выполнив `delete array'. см. главу 11 [массивы в awk], стр.123.

a.3.4 типы данных

значение выражения в awk всегда или число или цепочка. некоторые контексты (такие как арифметические операторы) требуют числовые значения. они конвертируют цепочки в числа, интерпретируя текст цепочки как число. если цепочка не похожа на число, она конвертируется в 0.

другие контексты (такие как конкатенация) требуют в качестве значения цепочки. они конвертируют числа в цепочки, фактически печатая их по sprintf. см. детали в разделе 7.4 [конверсии цепочек и чисел], стр. 81.

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

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

сравнения производится численно, если оба операнда числа или один есть число, а другой есть цепочка-число. в других случаях один или оба операнда конвертируются в цепочки и происходит сравнение цепочек. поля, ввод по getline, filename, элементы argv, элементы environ и элементы массива, образованные по split, являются единственно объектами, которые могут быть числовыми цепочками. строковые константы, такие как "3.1415927", не являются численными цепочками, они есть строковые константы. полные правила сравнения описаны в разделе 7.10 [типы переменных и сравнение выражений], стр. 88.

неинициализированные переменные имеют значение цепочки "" (нулевая или пустая цепочка). в контексте, требующем число, это эквивалент нуля. см. подробности о наименовании и инициализации переменных в разделе 7.3 [переменные], стр. 79; см. раздел 7.4 [конверсии цепочек и чисел], стр. 81, о том как интерпретируются значения переменных.

a.4 образцы

awk-программы большей частью составлены из правил, каждое состоит из образца и следующего за ним действия. действие заключено между n `{' и `}'. в этой паре может отсутствовать либо образец, либо действие, но не оба вместе. если нет образца, действие выполняется для всякой входной записи. отсутствие действия эквивалентно `{ print }', который печатает целую строку.

комментарии начинаются с символа `#' и продолжаются до конца строки. пустые строки могут использоваться для разделения операторов. операторы нормально кончаются символом newline; однако, это не так в случае строк, заканчивающихся символами `,', `-', `>', `:', `&&' или `||'. строки, оканчивающиеся на do или else, также автоматически продолжают свои операторы на следующую строку. в остальных случаях строка может быть продолжена посредством окончания ее на `\', и в этом случае newline игнорируется.

несколько операторов могут располагаться в одной строке, если они разделены символами `;'. это применимо как к операторам внутри действия правила, так и к самим операторам правил.

см. разделе 2.2.5 [комментарии в awk-программах], стр. 13, для информации о соглашениях awk относительно комментариев; см. раздел 2.6 [операторы awk и строки], стр. 17, с описание механизма продолжения строк в awk.

a.4.1 обзор образцов

образцом в awk может быть одно из следующих:
 /регулярное выражение/;
 относительные выражения видов:
 pattern && pattern
 pattern || pattern
 ! pattern
 > pattern : pattern (pattern);
 диапазон pattern1, pattern2
 begin
 end

begin и end есть два специальных рода образцов, которые сопоставляются с вводом. действия всех правил begin сцепляются как если бы операторы были написаны в одном правиле begin. они выполняются до начала чтения ввода. подобным же образом соединяются все правила end и выполняются после завершения ввода (или когда выполняется оператор exit). образцы begin и end не могут комбинироваться с другими образцами в выражениях pattern. в правилах begin и end действия не могут быть пропущены.

для образца вида /regular-expression/ связанный с ним оператор выполняется для каждой входной записи, которая соответствует регулярному выражению. регулярные выражения кратко охарактеризованы ниже.

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

операторы `&&', `||' и `!' есть соответственно логическое "и", логическое "или" и логическое "нет", аналогично языку си. они делают короткозамкнутые оценки как и в си, и используются для выражений-образцов. как и в большинстве языков, скобки могут использоваться для изменения порядка действий.

оператор `?:' подобен такому же оператору в си. если первый образец соответствует, то второй образец проверяется на соответствие входной записи; в противном случае проверяется на соответствие третий образец. окончательно соответствовать записи может только второй или третий образец.

образец вида `pattern1, pattern2' называется диапазонным образцом. он соответствует всем входным записям, начиная с записи, отвечающей образцу pattern1, и кончая включительно записью, отвечающей образцу pattern2. см. раздел 8.1 [элементы-образцы], стр. 97.

a.4.2 регулярные выражения

регулярные выражения (для краткости regexp) основываются на posix eres (расширенные регулярные выражения). управляющие последовательности, допустимые в константах-цепочках, также действительны в регулярных выражениях (см. раздел 4.2 [управляющие последовательности], стр. 24). regexps составляются из символов подобно следующему:

c соответствует символу c (предполагается , что с не совпадает ни с одним из перечисленных ниже символов).

\c соответствует буквально символу c. . соответствует любому символу, включая newline. в строгом режиме posix `.' не соответствует пустому символу, состоящему только из нулевых битов.

^ соответствует началу цепочки.
$ соответствует концу цепочки.

[abc...] соответствует любому из символов abc . . . (список символов). [[:class:]] соответствует любому символу из класса class.

допускаются следующие классы:

alnum, alpha, blank, cntrl, digit, graph, lower, print, punct, space, upper, xdigit.

[[.symbol.]] соответствует много символьному collating symbol символу. gawk не поддерживает collating symbols (упорядочивающие символы). [[=classname=]] соответствует любому из эквивалентных символов в текущем локально названном по эквивалентности классе.

в настоящее время gawk не поддерживает классы эквивалентности. [^abc...] соответствует любому символу кроме abc . . . (список отрицаемых символов).

r1--r2 соответствует либо  r1 либо r2 (альтернатива).
r1r2 соответствует сначала r1, а затем r2 (конкатенация).
r+ соответствует одному или более соседних r.
r* соответствует нулю или более соседних r.
r? соответствует ни одному или  одному r.
(r) соответствует  r (группировка).

r-n"" r-n,"" r-n,m"" отвечают количествам вхождений г соответственно не меньше чем n, n или больше до некоторого номера, от n до m (интервальные выражения).

\y  соответствует пустой цепочке в начале или конце слова.

\b  соответствует пустой цепочке  внутри слова.
\!  соответствует пустой цепочке в начале слова.
\?  соответствует пустой цепочке в конце слова.
\w  соответствует любому символу, могущему входить в состав слова
	(буква, цифра и подчеркивание).
\w  соответствует любому символу, не могущему входить в состав слова.
\`  соответствует пустой цепочке в начале буфера
	(то же самое, что цепочка в gawk).
\'  соответствует пустой цепочке в конце буфера.

различные параметры командной строки управляют интерпретацией gawk символов в regexps.

когда параметров нет

по умолчанию gawk обеспечивает все средства posix regexps и gnu regexp операторов, описанных выше. однако, интервальные выражения не поддерживаются.

--posix поддерживаются только posix regexps, операторы gnu не являются специальными (например, `\w' соответствует литералу `w'). допускаются интервальные выражения.

--traditional соответствует традиционным unix awk regexps. операторы gnu не являются специальными. интервальные выражения не допускаются, также как символьные классы posix ([[:alnum:]] и прочие). символы, описываемые восьмеричными и шестнадцатеричными управляющими последовательностями трактуются буквально, даже если они представляют метасимволы regexp.

--re-interval допускаются интервальные выражения в regexps, даже если был указан `--traditional'. см. главу 4 [регулярные выражения], стр. 23.


<<< оглавление >>>