SliTaz Man Pages

Community Doc Forum Pro Shop Bugs Hg Cook

awk.

Section: Misc. Reference Manual Pages ()
Updated: MOPS 1.0
Index Return to Main Contents

НАЗВАНИЕ

gawk, awk — язык поиска и обработки шаблонов.

СИНТАКСИС

gawk [ POSIX or GNU style options ] -f program-file [ -- ] file ...
gawk [ POSIX or GNU style options ] [ -- ] program-text file ...

ОПИСАНИЕ

Gawk — это GNU реализация языка программирования AWK. Она соответствует определению языка, данному в POSIX 1003.2 Command Language And Utilities Standard. Этот стандарт, в свою очередь, основан на книге The AWK Programming Language, авторы Aho, Kernighan и Weinberger. Кроме того, в gawk внесены некоторые дополнительные возможности, появившимися в версии awk для UNIX System V Release 4. Поддерживаются и более поздние расширения awk, предложенные Bell Labs, а также некоторые расширения GNU.

Командная строка состоит из опций gawk, текста программы AWK (если не были указаны опции -f или --file) и значений, которые в дальнейшем будут присвоены встроенным переменным AWK ARGC и ARGV.

ФОРМАТ ОПЦИЙ

Опции gawk могут быть указаны как в традиционном для POSIX однобуквенном формате, так и в формате длинных опций GNU. Опции POSIX начинаются с “-”, а длинные опции начинаются с “--”. Длинные опции доступны как для специфичных для GNU возможностей, так и для стандартных возможностей POSIX.

В соответствие со стандартом POSIX, опции, специфичные для gawk, должны быть указаны в качестве аргументов опции -W. Может быть указано несколько опций -W. Каждой опции -W соответсвует длинная опция (см. ниже). Аргументы длинных опций могут быть указаны после знака = (без пробелов), либо следующим аргументом командной строки. Длинные опции можно сокращать, при условии сохранения уникальности опции.

ОПЦИИ

-F fs
--field-separator fs
Использовать fs в качестве разделителя полей (значение встроенной переменной FS).
-vпеременная=значение
--assign переменная=значение
Присвоить перед выполнением программы значение переменной. Такие переменные доступны в блоке BEGIN программы AWK.
-fфайл-с-программой
--fileфайл-с-программой
Взять программу AWK из файла-с-программой, вместо того, чтобы брать ее из первого аргумента командной строки. Может быть указано несколько опций -f (или --file).
-mf NNN
-mr NNN
Установить различные ограничения памяти в NNN. Флаг f устанавливает максимальное количество полей, а флаг r — максимальный размер записи. Эти два флага опции -m были введены в исследовательской версии Bell Labs UNIX awk. Они игнориуются gawk, так как gawk не имеет предопределенных ограничений.
-W traditional
-W compat
--traditional
--compat
Работать в режиме совместимости. В этом режиме gawk работает как UNIX awk. Расширения GNU не поддерживаются. Рекомендуется включать этот режим опцией --traditional. Более подробная информация приведена ниже в разделе РАСШИРЕНИЯ GNU.
-W copyleft
-W copyright
--copyleft
--copyright
Вывести краткую информацию GNU о правах и выйти.
-W help
-W usage
--help
--usage
Вывести относительно краткую справку по опциям. (В соответствие с GNU Coding Standards, эти опции приводят к немедленному нормальному выходу.)
-W lint
--lint
Выдавать предупреждения о наличии сомнительных или несовместих с другими версиями AWK конструкциях.
-W lint-old
--lint-old
Выдавать предупреждения о наличии конструкций, несовместих со старыми версиями UNIX awk.
-W posix
--posix
Включить режим совместимости со следующими ограничениями:

*
Не распознаются экранирующие последовательности \x.
*
Если значение FS - один пробел, то разделителями считаются только пробел и символ табуляции. Символ новой строки разделителем не считается.
*
Не распознается синоним func ключевого слова function.
*
Операторы ** и **=не могут быть использованы вместо ^ и ^=.
*
Недоступна функция fflush().

-W re-interval
--re-interval
Разрешить использование интервальных выражений в регулярных выражениях. (см. раздел Регулярные выражения ниже). Интервальные выражения традиционно отсутствовали в языке AWK. Стандарт POSIX внес их для совместимости awk и egrep друг с другом. Тем не менее, их использование может привести к ошибкам в работе старых программ AWK, поэтому gawk распознает их только если указана эта опция или опция --posix.
-W source текст-программы
--sourceтекст-программы
Использовать текст-программы в качестве текста программы AWK. Эта опция позволяет совмещать вызовы библиотечных функций (подключаемых через опции -f и --file) с исходным кодом, вводимым в командной строке. Эта опция, в первую очередь, предназначена для средних и больших по размеру программ AWK, используемых в скриптах shell.
-W version
--version
Вывести информацию о версии вашей копии gawk. Эта опция может быть полезна, если вы хотите узнать, не устарел ли gawk, установленный в вашей системе, а также если вы хотите сообщить об ошибке. (В соответствие с GNU Coding Standards, эти опции приводят к немедленному нормальному выходу.)
--
Конец опций. Эта опция используется для возможности обработки аргументов, начинающихся с ``-'', непосредственно программой AWK, что соответствует соглашению об обработке аргументов, используемому большинством других программ, совместимых со стандартом POSIX.

В режиме совместимости все другие опции считаются неверными и игнорируются. В обычном режиме, если указан текст программы, неизвестные опции передаются через массив ARGV программе AWK для обработки. Это очень удобно для запуска программ через ``#!''.

ИСПОЛНЕНИЕ ПРОГРАММЫ AWK

Программы AWK состоит из последовательности операторов шаблон-действие и, возможно, определений функций.

шаблон { операторы }


function имя(список параметров) { операторы }

Сначала gawk читает исходный текст программы из файлов-с-программой и из аргументов опции --source, если они указаны, или из первого аргумента командной строки, не являющегося опцией. Опции -f и --source могут быть указаны в командной строке несколько раз. Gawk воспринимает текст программы так, как будто все файлы-с-программой были сцеплены друг с другом. Это удобно при создании библиотек функций AWK, так как не требует явного определения функций в каждой новой программе, использующей их. Кроме того, эта возможность позволяет совмещать библиотечные функции с программами, указанными в командной строке.

Переменная окружения AWKPATH содержит путь, по которому производится поиск файлов, указанных в качестве аргумента опции -f. Если эта переменная не указана, то, по умолчанию, используется путь ".:/usr/local/share/awk". (Путь может быть и другим, это зависит от того, как gawk был скомпилирован и установлен.) Если имя файла, указанное в качестве аргумента опции -f, содержит символ ``/'', то поиск не производистся.

Gawk выполняет программы следующим образом. Сперва производится инициализация переменных, указанных опцией -v. Далее gawk компилирует программу во внутренний формат. Затем gawk исполняет код в блоке (блоках) BEGIN, если таковые имеются, и начинает читать файлы, имена которых содержатся в массиве ARGV. Если в командной строке не были указаны файлы, то gawk читает стандартный поток ввода.

Если имя файла в командной строке имеет вид переменная=значение, то оно воспринимается как операция присваивания. Переменной присваивается значение. (Это происходит после выполнения блока (блоков) BEGIN.) Присваивание значений переменным в командной строке удобно для динамической инициализации переменных, используемых AWK для определения способа деления входного потока на поля и записи. Кроме того, оно может пригодится в тех случаях, когда требуется несколько раз обработать один и тот же файл.

Если значение какого-либо элемента ARGV пусто (""), то gawk пропускает его.

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

Наконец, после того, как весь входной поток обработан, gawk исполняет код блока (блоков) END, если таковые имеются.

ПЕРЕМЕННЫЕ, ЗАПИСИ И ПОЛЯ

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

Записи

По умолчанию записи разделяются символами новой строки. Вы можете переопределить способ разделения записей, присвоив нужное значение встроенной переменной RS. Если значение RS - единственный символ, то он будет использоваться для разделения записей. В противном случае RS - регулярное выражение. Текст входного потока, совпавший с ним, будет разделять записи. В режиме совместимости для разделения записей будет использоваться только первый символ строки выражения. Если RS - пустая строка, то записи будут разделяться пустыми строками. При этом символ новой строки всегда будет работать как разделитель полей, в дополнение к значению FS.

Поля

Каждую считываемую строку gawk разбивает на поля, используя значение переменной FS в качестве разделителя. Если значение FS - единственный символ, то поля разделяются этим символом. Если значение FS - пустая строка, то каждый символ считается отдельным полем. В противном случае, FS считается регулярным выражением. Исключение составляет случай, когда значение FS - один пробел. При этом поля разделяются комбинациями пробелов и/или символов табуляции, и/или символами новой строки. (См. также информацию по --posix ниже.) Заметьте, что значение IGNORECASE (см. ниже) также будет влиять на разделение полей, если FS - регулярное выражение, и на разделение записей, если RS - регулярное выражение.

Если переменная FIELDWIDTHS содержит список чисел, разделенных пробелами, то gawk считает ширину каждого поля фиксированной и разделяет запись в соответствие c указанными значениями. Значение переменной FS в этом случае игнорируется. Присваивание нового значения переменной FS аннулирует использование FIELDWIDTHS и восстанавливает поведение, принятое по умолчанию.

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

n = 5
print $n

выведет пятое поле записи. Переменная NF содержит количество полей входной записи.

Результатом ссылки на несуществующее поле (т. е. поле с номером, превышающим $NF) является пустая строка. Присваивание значения несуществующему полю (например, $(NF+2) = 5) увеличивает значение NF и создает промежуточные поля с пустой строкой в качестве значения. Содержимое переменной OFS используется в качестве разделителя полей. Значение $0 вычисляется заново. Ссылка на поля с отрицательными номерами является ошибкой. Уменьшение значения NF вызывает потерю значений полей с номерами, превышающими новое значение. Значение $0 вычисляется заново, поля разделяются содержимым переменной OFS.

Встроенные переменные

Встроенными переменными Gawk являются:

ARGC
Количество аргументов командной строки (исключая опции gawk и исходный текст программы).
ARGIND
Индекс массива ARGV, указывающий на обрабатываемый в данный момент файл.
ARGV
Массив аргументов командной строки. Индекс массива может принимать значения от 0 до ARGC - 1. Изменяя в процессе работы программы содержимое ARGC, можно контролировать, какие файлы обрабатываются.
CONVFMT
Формат преобразования чисел. По умолчанию "%.6g".
ENVIRON
Массив текущих значений переменных окружения. Массив индексирован по названиям переменных, каждый элемент содержит значение соответствующей переменной (например, ENVIRON["HOME"] может иметь значение /home/arnold). Изменение содержимого этого массива не влияет на значения переменных окружения, видимых программами, запускаемыми из gawk с помощью функции system(). (Возможно, в следующих версиях gawk это изменится.)
ERRNO
Если происходит системная ошибка при перенаправлении для getline, при чтении для getline, или при вызове close(), то ERRNO будет содержать строку, которая описывает ошибку.
FIELDWIDTHS
Список длин полей, разделенный пробелами. Если этой переменной присваивается новое значение, то gawk разделяет входные данные на поля фиксированной длины, при этом значение переменной FS игнорируется. Возможность работы с полями фиксированной длины все еще находится в стадии проверки; семантика может поменяться в процессе развития gawk.
FILENAME
Имя файла, обрабатываемого в данный момент. Если в командной строке не было указано ни одного файла, то значение FILENAME равно ``-''. В блоке BEGIN переменная FILENAME не определена.
FNR
Номер входной записи в текущем входном файле.
FS
Разделитель полей во входном потоке, по умолчанию пробел. Обращайтесь к подразделу Поля выше.
IGNORECASE
Контролирует зависимость всех регулярных выражений и строковых операций от регистра. Если значение IGNORECASE не равно нулю, то при работе с регулярными выражениями регистр будет игнорироваться в следующих случаях: при сравнении строк и проверке шаблонов в правилах; при разделении на поля с использованием значения FS; при разделении на записи с использованием значения RS; в регулярных выражениях c ~ и !~; во встроенных функциях gensub(), gsub(), index(), match(), split() и sub(). Таким образом, если значение IGNORECASE не равно нулю, то /aB/ совпадет с любой строкой из "ab", "aB", "Ab" или "AB". Как и у всех переменных AWK, начальное значение IGNORECASE равно 0, так что все операции со строками и регулярными выражениями изначально чувствительны к регистру. В Unix при игнорировании регистра используется полный набор символов ISO 8859-1 Latin-1. ПРИМЕЧАНИЕ: В версиях gawk до 3.0 значение IGNORECASE влияло только на операции с регулярными выражениями. В данный момент оно влияет и на операции сравнения строк.
NF
Количество полей в текущей входной записи.
NR
Общее количество встреченных записей.
OFMT
Формат вывода чисел. По умолчанию "%.6g".
OFS
Разделитель выходных полей. По умолчанию пробел.
ORS
Разделитель выходных записей. По умолчанию символ новой строки.
RS
Разделитель входных записей. По умолчанию символ новой строки.
RT
Конец записи. Gawk присваивает RT значение входного текста, совпавшего с символом или регулярным выражением, содержащимся в RS.
RSTART
Индекс первого символа, совпавшего при вызове match(). 0, если совпадения не было.
RLENGTH
Длина строки, совпавшей при вызове match(). -1, если совпадения не было.
SUBSEP
Символ, используемый для разделения элементов в массиве. По умолчанию " 34".

Массивы

Массивы индексируются по выражению, указанному между квадратными скобками ([ и ]). Если выражение является списком выражений (выражение, выражение ...), то массив индексируется по строке, состоящей из сцепленных (строковых) значений всех выражений, разделенных значением переменной SUBSEP. Эта возможность используется для имитирования многомерных массивов. Например

i = "A"; j = "B"; k = "C"
x[i, j, k] = "hello, world

присваивает элементу массива x, индексированного по строке "A 34B 34C", строку "hello, world. Все массивы в AWK ассоциативны, т.е. индексируются по строковым значениям.

Для проверки существования в массиве определенного индекса в операторах if и while может быть использован специальный оператор in.

if (val in array) print array[val]

Если массив многомерный, используйте (i, j) in array.

Конструкция in может быть также использована в цикле for для перебора всех элементов массива.

Элемент может быть удален из массива оператором delete. Кроме того, оператор delete может быть использован для удаления всего массива. Для этого нужно указать имя массива без индекса.

Типы переменных и их преобразование

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

Если вы хотите, чтобы переменная считалась числом, добавьте к ней 0. Если вы хотите, чтобы переменная считалась строкой, сцепите ее с пустой строкой.

Конвертирование строки в число производится с помощью atof(3). Конвертирование числа в строку производится с помощью sprintf(3), путем использования значения CONVFMT в качестве строки форматирования, и числового значения переменной в качестве аргумента. Хотя все числа в AWK считаются числами с плавающей запятой, целые значения всегда преобразуются как целые. Поэтому в

CONVFMT = "%2.2f" a = 12 b = a ""

строковое значение переменной b будет "12", а не "12.00".

Gawk выполняет сравнения следующим образом: если две переменные имеют числовое значение, то они сравниваются как числа; если одна переменная имеет числовое значение, а вторая является ``строкой-числом'' (т.е. строкой, состоящей из цифр), то переменные сравниваются как числа. Во всех остальных случаях производится преобразование числа в строку, и переменные сравниваются как строки. Две строки, естественно, сравниваются как строки. В соответствие со стандартом POSIX, даже если две строки являются ``строками-числами'', то они сравниваются как числа. Но это, безусловно, неправильно, поэтому gawk не делает этого.

Заметьте, что строковые константы, такие как "57", не являются ``строками-числами'', а именно строковыми константами. Термин ``строка-число'' применим лишь к полям, входным данным getline, FILENAME, элементам ARGV, элементам ENVIRON и тем элементам массива, созданного split(), которые являются числовыми строками. Основная идея в том, что таким образом интерпретируется только входная информация пользователя, выглядящая, как число.

Переменные, неинициализированные явно, имеют числовое значение 0 и строковое значение "" (пустая строка).

ШАБЛОНЫ И ДЕЙСТВИЯ

AWK - это язык, ориентированный на строки. Сперва указывается шаблон, затем действие. Операторы действия заключаются в фигурные скобки { и }. Шаблон или действие могут быть пропущены, но, естественно, не то и другое одновременно. Если не указан шаблон, то действие будет выполняться для каждой входной записи. Пропущенное действие эквивалентно

{ print }

то есть, выводу всей записи.

Комментарии начинаются с символа ``#'' и продолжаются до конца строки. Для разделения операторов могут использоваться пустые строки. Обычно оператор заканчивается концом строки, кроме случаев, когда строки оканчиваются символами ``,'', {, ?, :, && или ||. Если строка оканчивается do или else, подразумевается, что оператор продолжается в следующей строке. В других случаях строка может быть продолжена с помощью символа ``'', при этом символ новой строки будет проигнорирован.

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

Шаблоны

Шаблоны AWK могут быть следующими:


BEGIN
END
/регулярное выражение/
условное выражение
шаблон && шаблон
шаблон || шаблон
шаблон ? шаблон : шаблон
(шаблон )
!шаблон
шаблон1, шаблон2

BEGIN и END - два специальных шаблона, которые не проверяются на совпадение со входными данными. Действия всех шаблонов BEGIN объединяются, как будто все операторы были указаны в одном блоке BEGIN. Операторы этих блоков выполняются перед чтением каких-либо входных данных. Подобным образом объединяются все блоки END. Операторы этих блоков выполняются после чтения всех входных данных (или после выполнения оператора exit). BEGIN и END не могут быть объединены в шаблонных выражениях с другими шаблонами. Действие для шаблонов BEGIN и END обязательно должно быть указано.

Действие, связанное с шаблонами /регулярное выражение/ , выполняется для всех входных записей, совпавших с регулярным выражением. Регулярные выражения те же, что и в egrep(1), общая информация по ним дана ниже.

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

Операторы &&, ||, и ! - это логические И, ИЛИ и НЕ, соответственно. Эти операторы используются для объединения более простых шаблонных выражений. Как и в большинстве языков, для изменения очередности вычислений могут применяться круглые скобки. Как и в C, используется краткое вычисление логических выражений.

Оператор ?: соответствует оператору C. Если первый шаблон - истина, то для проверки используется второй шаблон, в противном случае - третий. Вычисляется только второй, или только третий шаблон.

Выражение шаблон1, шаблон2 называется шаблоном области. Он совпадает со всеми записями, начиная с записи, совпавшей с шаблоном1, и заканчивая совпавшей с шаблоном2, включительно. Этот шаблон не может быть объединен с другими шаблонами.

Регулярные выражения

Регулярные выражения AWK - это расширенная версия регулярных выражений egrep. Они составляются из символов следующим образом:
c
совпадает c не-метасимволом c.
совпадает с символом c.
.
совпадает с любым символом, включая символ начала строки.
^
совпадает с началом строки.
$
совпадает с концом строки.
[abc...]
список символов, совпадает с любыми символоми abc....
[^abc...]
инвертированный список символов, совпадает с любыми символами, кроме abc....
r1|r2
альтернатива: совпадает либо с r1, либо с r2.
r1r2
сцепление: совпадает сперва с r1, затем с r2.
r+
совпадает с одним или более r.
r*
совпадает с ноль или более r.
r?
совпадает с ноль или одним r.
(r)
группирование: совпадает с r.
r{n}
r{n,}
r{n,m}
Одно или два числа в фигурных скобках обозначают интервальное выражение. Если в скобках указано одно число, то предыдущее регулярное выражение r повторяется n раз. Если указаны два числа, разделенные запятой, то r повторяется от n до m раз. Если указано только одно число после запятой, то r повторяется, как минимум, n раз.

Интервальные выражения можно использовать, только если в командной строке указана либо опция --posix, либо --re-interval.

y
совпадает с пустой строкой либо в начале, либо в конце слова.
B
совпадает с пустой строкой в слове.
<
совпадает с пустой строкой в начале слова.
>
совпадает с пустой строкой в конце слова.
fBW
совпадает с любым текстовым символом (буква, цифра или подчеркивание).
W
совпадает с любым нетекстовым символом.
`
совпадает с пустой строкой в начале буфера (строки).
'
совпадает с пустой строкой в конце буфера.

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

Классы символов - новая возможность, введенная стандартом POSIX. Класс символов - это специальная система обозначений списков символов, имеющих особый признак. При этом символы списка в разных странах и/или в разных наборах символов (кодировках) могут различаться. Например, понятия символов алфавита различаются в США и во Франции.

Классы символов можно указывать в регулярных выражениях только внутри скобок, ограничивающих список символов. Класс символов состоит из [:, ключевого слова, обозначающего класс, и :]. Ниже приведены классы символов, определенные стандартом POSIX.

[:alnum:]
Текстовые символы (буквы, цифры, подчеркивание).
[:alpha:]
Алфавитные символы.
[:blank:]
Символы пробела или табуляции.
[:cntrl:]
Управляющие символы.
[:digit:]
Символы цифр.
[:graph:]
Символы одновременно и видимые, и печатаемые. (Пробел печатаем, но не видим, в то время, как a - и то и другое.)
[:lower:]
Алфавитные символы нижнего регистра.
[:print:]
Печатаемые символы (не являющиеся управляющими).
[:punct:]
Знаки препинания (не буквы, не цифры, не управляющие символы и не пробел).
[:space:]
Символы пробела (такие, как пробел, табуляция, перевод формата).
[:upper:]
Алфавитные символы верхнего регистра.
[:xdigit:]
Символы, являющиеся шестнадцатеричными цифрами.

Например, до появления стандарта POSIX для совпадения текстовых символов нужно было указать /[A-Za-z0-9]/. Если набор символов (кодировка) включал в себя другие символы, то совпадения не происходило. С классами символов POSIX вы можете написать /[[:alnum:]]/, это выражение совпадет со всеми алфавитными и цифровыми символами вашего набора символов (кодировки).

В списках символов могут быть указаны еще две дополнительные последовательности. Они относятся к не-ASCII наборам символов, в которых могут встречаться: символы (так называемые элементы сортировки), представленные более, чем одним символом; эквивалентные, с точки зрения сортировки, символы. (Например, во Франции, обычная ``e'' и акцентированная e` эквивалентны.)

Символы сортировки
Символы сортировки - это многосимвольные элементы сортировки, заключенные между [. и .]. Например, если ch - элемент сортировки, то [[.ch.]] - регулярное выражение, совпадающее с этим элементом сортировки, в то время, как [ch] - регулярное выражение, совпадающее либо с c, либо с h.
Классы эквивалентности
Класс эквивалентности - это зависимое от локали (locale) имя для списка символов, являющихся эквивалентными. Имя заключается между [= и =]. Например, имя e может быть использовано для представления ``e,'' ``e`,'' и ``e`.'' В этом случае, [[=e]] - регулярное выражение, совпадающее с

 .BR e ,



 .BR e' , и



 .BR e` .

Эти возможности очень ценны в не-английских локалях. Библиотечные функции, используемые gawk для работы с регулярными выражениями, в данный момент распознают только классы символов POSIX. Они не распознают символы сортировки и классы эквивалентности.

Операторы y, B, <, >, fBW, `, и ' являются особенностью gawk, а именно, его расширениями, основанными на возможностях библиотек GNU для работы с регулярными выражениями.

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

Без опций
По умолчанию, gawk предоставляет все возможности регулярных выражений POSIX и операторов GNU для регулярных выражений, как описано выше. Не поддерживаются лишь интервальные выражения.
--posix
Поддерживаются лишь регулярные выражения POSIX, операторы GNU не имеют специального значения. (Например, fBw). Интервальные выражения разрешены.
--traditional
Используются традиционные регулярные выражения Unix awk. Операторы GNU не имеют специального значения, интервальные выражения не поддерживаются, классы символов POSIX ([[:alnum:]] и т. д.) не поддерживаются. Символы, указанные с помощью восьмиричной или шестнадцатиричной экранирующей последовательности, воспринимаются буквально, даже если они представляют собой метасимволы регулярных выражений.
--re-interval
Позволяет использовать интервальные выражения, даже если указана опция --traditional.

Действия

Операторы действия заключаются в фигурные скобки { и }. Операторы действия состоят из встречающихся во многих языках, операторов присваивания, ветвления, цикла. Операции, управляющие операторы и операторы ввода/вывода похожи на подобные им из языка C.

Операции

В AWK определены следующие операции, в порядке убывания приоритета,

(...)
Группирование
$
Ссылка на поле.
++ --
Инкремент и декремент, оба могут быть префиксными и постфиксными.
^
Возведение в степень (можно также использовать ** и **= с оператором присваивания).
+ - !
Унарный плюс, унарный минус и логическое отрицание.
* / %
Умножение, деление и модуль.
+ -
Сложение и вычитание.
пробел
Сцепление строк.
=
!= ==
Обычные операции сравнения.
~ !~
Совпадение и несовпадение регулярного выражения. ПРИМЕЧАНИЕ: Не используйте регулярное выражение-константу (/foo/) слева от ~ или от !~, только справа. Выражение /foo/ ~ выражение имеет то же значение, что и (($0 ~ /foo/) ~ выражение). Обычно это не то, что предполагалось.
in
Существование в массиве.
&&
Логическое И.
||
Логическое ИЛИ.
?:
Условное выражение C. Оно имеет вид выражение1 ? выражение2 : выражение3. Если выражение1 является истиной, то результатом является выражение2, в противном случае - выражение3. Вычисляется либо выражение2, либо выражение3.
= += -=
*= /= %= ^=
Присваивание. Поддерживается как простое присваивание (переменная = значение), так и сложные виды присваивания (операция-присваивание).

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

Управляющими операторами являются:


if (условие) оператор [ elseоператор]
while (condition) оператор
do операторwhile (условие)
for (выражение1; выражение2; выражение3) оператор
for (переменная inмассив) оператор
break
continue
delete массив[индекс]
delete массив
exit [ выражение ]
{ операторы}





 

Операторы ввода/вывода




Операторами ввода/вывода являются:



<DL COMPACT>

close(file)


Закрыть файл (или канал, см. ниже).

getline


Считать следующую запись в $0.

                             Установить NFNRFNR.

getline <файл


Считать следующую запись файла в $0.

                             Установить NF.


getlineпеременная


Считать следующую запись в

                             переменную.  Установить NRFNR.


getlineпеременная <файл


Считать следующую запись файла в

                             переменную.


next



 Прекратить обработку текущей входной

  записи.  Считать  следующую  входную

 запись  и  начать  ее  обработку   с

  первого  шаблона программы AWK. Если

 обработаны все  входные  данные,  то

  выполнить  блок(и) END, если таковые

 имеются.


nextfile



 Прекратить    обработку     текущего

                             входного  файла.  Следующая  входная

                             запись будет прочитана из следующего

                             входного  файла.  FILENAME и ARGIND



                             обновляются, FNR присваивается  1,

                             обработка   начинается   с   первого

                             шаблона   программы    AWK.     Если

                             обработаны  все  входные  данные, то

                             выполнить блок(и) END, если  таковые

                             имеются.    ПРИМЕЧАНИЕ:

                             В   ранних

                             версиях     gawk      использовалась

                             конструкция next file (в два слова).

                             Хотя   эта   конструкция   все   еще

                             распознается,               выдается

                             предупреждающее     сообщение.     В

                             конечном   счете,   она   не   будет

                             поддерживаться.


print


Вывести текущую запись. Запись

                             оканчивается  содержимым  переменной

                             ORS.

printсписок-выражений


Вывести выражения. Выражения

                             разделяются   содержимым  переменной

                             OFS.  Запись оканчивается содержимым

                             переменной OFS.

printсписок-выражений >файл


Вывести выражения в файл. Выражения

                             разделяются  содержимым   переменной

                             OFS.  Запись оканчивается содержимым

                             переменной ORS.

printfформат, список-выражений



 Отформатировать и вывести.

printfформат, список-выражений >файл


Отформатировать и вывести в файл.

system(командная-строка)


Выполнить команду, указанную в

                             командной-строке,   и   вернуть  код

                             выхода  из   команды.    (Может   не

                             работать на не-POSIX системах.)

fflush([файл])


 Сбросить    буфера,    связанные   с

                             открытым  для  записи   файлом   или

                             каналом  файл.  Если файл не указан,

                             происходит       сброс       буферов

                             стандартного  потока  вывода.   Если

                             файл - пустая строка, то  происходит

                             сброс буферов всех открытых файлов и

                             каналов.




 Разрешены и другие перенаправления ввода/вывода. Для print

       и  printf,  >> файл добавит

       выводимые данные в файл, а

       |команда выведет данные  в  канал.

       Подобным  же  образом,

       команда   | getline  позволяет getline

       считывать данные из

       канала.  Команда getline возвращает 0 по достижении  конца

       файла и -1 при ошибке.



 

Оператор printf


AWK версии оператора printf и функции sprintf() (см. ниже)

       воспринимают следующие форматы:
<DL COMPACT>
%c



 ASCII символ.  Если аргумент %c является числом, то

              он  интерпретируется  как  символ  и  выводится.  В

              противном  случае,  аргумент  интерпретируется  как

              строка,  и  выводится  только  первый  символ  этой

              строки.

.br
%d


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


.br
%E

 Число    с     плавающей     запятой     в     виде

              [-]d.dddddde[+-]dd.   Формат %E использует E вместо

              e.


%f


Число с плавающей запятой в виде [-]ddd.dddddd.

.br
%g


.br
%G

 Использовать либо формат %e,  либо  формат %f,  в

              зависимости от того, что короче. Незначащие нули не

              выводятся.  Формат %G испольует %E вместо %e.


%o



 Беззнаковое восьмиричное число (целое).


%s


Строка символов.

.br
%x


.br
%X

 Шестнадцатиричное   число   (целое).    Формат  %X

              использует ABCDEF

              вместо abcdef.
%%


Один символ %. Преобразование аргумента не

              производится.



Возможно указание дополнительных, необязательных

       параметров между символом % и буквой формата:
<DL COMPACT>

-


Выражение должно быть выравнено по левой границе

              поля.

пробел


Для числовых преобразований; выводить перед

              положительными     значениями     пробел,     перед

              отрицательными - знак минуса.

+


Знак плюса, указанный перед параметром ширины (см.

              ниже),   предписывает   всегда  выводить  знак  для

              числовых преобразований,  даже  если  форматируемые

              данные  имеют положительное значение.  + аннулирует

              параметр пробел.

#



 Использовать ``альтернативный вид''  для  некоторых

              форматов.  Для %o - вывести впереди ноль.  Для %x и

              %X - вывести впереди  0x  или  0X,  если  результат

              отличен  от  нуля.   Для  %e,  %E  и %f - результат

              всегда будет содержать десятичную запятую.  Для  %g

              и %G - конечные нули не будут убраны из результата.


0



 Ведущий  0 (ноль)  служит  признаком   того,   что

              выводимое  поле  должно быть заполнено нулями, а не

              пробелами.  Это  относится   ко   всем   нечисловым

              форматам вывода. Признак влияет, только если ширина

              поля превышает ширину выводимого значения.

ширина


Поле должно быть заполнено до этой ширины. Обычно

              поле заполняется пробелами. Если указан параметр 0,

              то поле будет заполнено нулями.

.точность


Число определяет точность вывода. Для форматов %e,

              %E  и  %f  указывается  количество  цифр, выводимых

              справа от десятичной запятой.  Для форматов %g и %G

              указывается  максимальное количество значащих цифр.

              Для форматов %d,


%o,


%i,


%u,


%x,

  и  %X указывается

              минимальное  количество выводимых цифр.  Для строки

              указывается   максимальное   количество   выводимых

              символов строки.




 Поддерживаются  динамическая  ширина  и  точность  функции

       printf() ANSI C.  Если вместо ширины  или  точности  будет

       указана *, то их значения будут взяты из списка аргументов

       printf или sprintf().



 

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


При перенаправлении ввода/вывода print и printf в файл или

       getline из  файла, gawk распознает некоторые специальные

       имена файлов. Эти имена могут использоваться для доступа к

       дескрипторам  открытых  файлов, наследованных от процесса,

       породившего gawk (обычно shell).  Другие специальные имена

       предоставляют  доступ  к  информации о работающем процессе

       gawk.
<DL COMPACT>
/dev/pid


Чтение этого файла возвращает идентификатор

                   текущего   процесса   в   десятичной   системе

                   исчисления, с символом новой строки в конце.

/dev/ppid



 Чтение этого  файла  возвращает  идентификатор

                   процесса,   породившего   текущий  процесс,  в

                   десятичной  системе  исчисления,  с   символом

                   новой строки в конце.

/dev/pgrpid


Чтение этого файла возвращает идентификатор

                   группы текущего процесса в десятичной  системе

                   исчисления, с символом новой строки в конце.


/dev/user



 Чтение  этого  файла  возвращает  одну запись,

                   оканчивающуюся  символом  новой  строки.  Поля

                   разделены пробелами.  $1 - значение системного

                   вызова getuid(2),

                   $2 -  значение  системного

                   вызова geteuid(2), $3 -

                   значение системного

                   вызова getgid(2),

                   и $4 -  значение  системного

                   вызова   getegid(2).

                   Если     имеются

                   дополнительные   поля,   то    они    являются

                   идентификаторами   групп,  возвращенными  getgroups(2).     Множественные     группы     не

                   поддерживаются во всех системах.

/dev/stdin


Стандартный поток ввода.

/dev/stdout


Стандартный поток вывода.

/dev/stderr


Стандартный поток ошибок.

/dev/fd/n


Файл, связанный с дескриптором открытого файла

                   n.



Специальные имена файлов очень удобны для вывода сообщений

       об ошибках. Например:



<DL COMPACT>



print "You blew it!" > &quot;/dev/stderr&quot;




В противном случае, пришлось бы использовать



<DL COMPACT>



print "You blew it!" | &quot;cat 1>&2&quot;




Эти имена могут быть использованы в командной строке для

       указания файлов данных.



 

Числовые функции


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



<DL COMPACT>

atan2(y, x)



 возвращает арктангенс y/x в радианах.

cos(выражение)


возвращает косинус выражения.

exp(выражение)


the exponential function.

int(выражение)


truncates to integer.

log(выражение)


функция натурального логарифма.

rand()


возращает случайное число между 0 и 1.

sin(выражение)



 возращет синус выражение.  Выражение  должно

                     быть в радианах.

sqrt(выражение)



 функция квадратного корня.

srand([выражение])


 устанавливает выражение как новую базу для

                     генератора сучайных чисел. Если выражение не

                     указано,   то  используется  текущее  время.

                     Возвращаемое значение равно предыдущей  базе

                     генератора случайных чисел.



 

Строковые функции




Gawk имеет следующие встроенные строковые функции:



<DL COMPACT>

gensub(r, s, h [, t])


 ищет   в  строке  t совпадения  с

                               регулярным выражением r.   Если  h

                               является строкой, начинающейся с g

                               или G, то заменяет все  совпадения

                               r  на  s.   В  противном случае, h

                               является   числом,    указывающим,

                               которое   по  счету  совпадение rr

                               заменять.  Если t не  указано,  то

                               используется  $0.  В тексте замены

                               s последовательность \fRn, где  n  -

                               это  цифра  от  1 до 9, может быть

                               использована для ссылки  на  текст

                               n-ного,   заключенного  в  скобки,

                               подвыражения.   Последовательность

                                  ссылается  на  весь  совпавший

                               текст, как и символ &.  В  отличие

                               от  sub() и gsub(),  измененная

                               строка возвращается как  результат

                               функции,   а  исходная  строка  не

                               изменяется.



gsub(r, s [, t])


 каждую   подстроку    строки  t,

                               совпавшую  с регулярным выражением

                               r,  заменяет   на   строку s и

                               возвращает  количество

                               осуществленных замен.  Если  t  не

                               указана,   то   используется  $0.

                               Вместо   &   в    тексте    замены

                               подставляется   совпавшая  строка.

                               Для вывода символа  &  используйте

                               .    За   полной  информацией  о

                               правилах для &и \fR в тексте замены

                               в  sub()
,  gsub()  и gensub(),

                               обращайтесь к  AWK  Language  Pro-

                               gramming
.


index(s, t)


возвращает индекс строки t в

                               строке  s,  или  0,  если   t   не

                               найдена.

length([s])


 возвращает  длину  строки  
s  или,

                               если s не указана, длину $0.


match(s, r)


возвращает позицию, с которой

                               регулярное выражение r совпадает с

                               s или, если  r  не  совпадает,  0.

                               Устанавливает  значения  RSTART  и

                               RLENGTH.


split(s, a [, r])

разбивает строку s на основе

                               регулярного  выражения r, помещает

                               результат в массив a и  возвращает

                               количество   полей.   Если   r  не

                               указано,   то   используется  FS.

                               Массив a предварительно очищается.

                               Функция работает подобно  разбивке

                               на поля, описанной выше.
sprintf(fmt, expr-list)



 выводит     список-выражений     в

                               соответствии    с    форматом    и

                               возвращает получившуюся строку.

sub(r, s [, t])


 то же, что и gsub(), но заменяется только первая совпавшая подстрока.


substr(s, i [, n])

возвращает n-символьную подстроку

                               строки s, начиная с i.  Если n не

                               указано,  то  возвращается остаток

                               строки s.
tolower(str)


возвращает копию строки, в которой

                               все   символы  верхнего  регистра,

                               встречающиеся в строке, переведены

                               в   соответствующие   им   символы

                               нижнего  регистра.    Неалфавитные

                               символы остаются без изменений.

toupper(str)


возвращает копию строки, в которой

                               все  символы   нижнего   регистра,

                               встречающиеся в строке, переведены

                               в   соответствующие   им   символы

                               верхнего  регистра.   Неалфавитные

                               символы остаются без изменений.



 

Функции для работы со временем




Так как одно из основных применений программ AWK -

       обработка  журнальных  (протокольных)  файлов,  содержащих

       отметки о времени, gawk предоставляет  две  функции  для

       получения и форматирования меток времени.



<DL COMPACT>

systime()


возвращает текущее время в виде количества

                 секунд с начала эпохи  (полночь  UTC,  1  января

                 1970 г на системах POSIX).

strftime([формат[, время]])


 форматирует  время  в  соответствии  с указанным

                 форматом Время должно быть в виде, возвращемом

                 systime().     Если   время   не   указано,   то

                 использутеся  текущее  время.   Если  не  указан

                 формат,  то  используется  формат  по умолчанию,

                 эквивалентный  выводу  date(1).

                 Для   гарантии

                 правильности  указываемых форматов обращайтесь к

                 руководствам  по  функции  strftime()  ANSI   C.

                 Свободно  распространяемая  версия strftime(3) и

                 руководство (man) к  ней  поставляются  с  gawk.

                 Эта  версия  была  использована для сборки gawk,

                 так что все форматы,  описанные  в  руководстве,

                 доступны в gawk.



 

Строковые константы




Строковыми константами в AWK являются последовательности

       символов, заключенные в двойные  кавычки  (").  В  строках

       могут  быть  использованы экранирующие последовательности,

       соответствующие языку C. К ним относятся:



<DL COMPACT>

\


обратный слэш (backslash).



символ ``предупреждение''. Обычно символ ASCII BEL.

fB


забой (backspace).



перевод формата (form-feed).

fR


новая строка (newline).



возрат каретки (carriage return).




 горизонтальная табуляци (horizontal tab).

fBfIшестнадцатиричные цифры


вертикальная табуляция (vertical tab).

fIшестнадцатиричные цифры


символ, соответствующий строке шестнадцатеричных

            цифр,   следующих  за fB"-,  2-  или  3-х  цифровой

            последовательностью   восмиричных   цифр.   Например,

            " 33"


            является символом ASCII ESC (escape).

\fRc


Символ c.



Экранирующие последовательности также могут быть

       использованы в регулярных выражениях-константах (например,

       /[  r

Index

НАЗВАНИЕ
СИНТАКСИС
ОПИСАНИЕ
ФОРМАТ ОПЦИЙ
ОПЦИИ
ИСПОЛНЕНИЕ ПРОГРАММЫ AWK
ПЕРЕМЕННЫЕ, ЗАПИСИ И ПОЛЯ
Записи
Поля
Встроенные переменные
Массивы
Типы переменных и их преобразование
ШАБЛОНЫ И ДЕЙСТВИЯ
Шаблоны
Регулярные выражения
Действия
Операции
Управляющие операторы
Операторы ввода/вывода
Оператор printf
Специальные имена файлов
Числовые функции
Строковые функции
Функции для работы со временем
Строковые константы