gawk - язык сканирования и обработки шаблонов
gawk [ опции в стиле POSIX или GNU ] -f program-file [ -- ] file ... gawk [ опции в стиле POSIX или GNU ] [ -- ] program-text file ... pgawk [ опции в стиле POSIX или GNU ] -f program-file [ -- ] file ... pgawk [ опции в стиле POSIX или GNU ] [ -- ] program-text file ...
Gawk это GNU реализация языка программирования AWK. Она совместима с определением языка в стандарте POSIX 1003.2 "Command Language And Utilities Standard". Эта версия в свою очередь базируется на описании "The AWK Programming Language" Э.Ахо, Б.Кернигана и П.Вайнбергера, с дополнительными возможностями найдеными в System V Release 4 версии UNIX awk. Gawk также поддерживает расширения для AWK компании Bell Laboratories, и множество расширений специфичных для GNU. Pgawk это профильная версия gawk. Она идентична gawk, за исключением того, что запускается намного медленее , и автоматически создает профиль выполнения в файле awkprof.out, при успешном выполнении. Смотриие также опцию --profile. Командная строка состоит из опций для gawk, текста программы AWK (если не указаны опции -f или --file, и значения которые будут доступны через предопределенные переменные ARGC и ARGV языка AWK.
Переменные в 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+2) = 5) увеличивает значение NF и создает промежуточные поля с пустой строкой в качестве значения. Содержимое переменной OFS используется в качестве разделителя полей. Значение $0 вычисляется заново. Ссылка на поля с отрицательными номерами является ошибкой. Уменьшение значения NF вызывает потерю значений полей с номерами, превышающими новое значение. Значение $0 вычисляется заново, поля разделяются содержимым переменной OFS.
Gawk имеет следующие встроенные переменные:
* при разделении на поля с использованием значения 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.1.4, сравнение символов полностью совметимо с локалью, основано на библиотечных (<ctype.h>) функциях языка C isalpha(3) и tolupper(3).
Массивы индексируются по выражению, указанному между квадратными скобками ([ и ]). Если выражение это списком выражений (выражение, выражение ...), то массив индексируется по строке, состоящей из сцепленных (строковых) значений всех выражений, разделенных значением переменной SUBSEP. Эта возможность используется для моделирования многомерных массивов. Например:
i = "A"; j = "B"; k = "C" x[i, j, k] = "hello, world\n"
if (val in array) print array[val]
(i, j) in array.
Переменные и поля могут быть числами с плавающей запятой, строками или и тем, и другим одновременно. Тип переменной зависит от контекста. В числовых выражениях переменная считается числом, в строковых - строкой. Если вы хотите, чтобы переменная считалась числом, добавьте к ней 0. Если вы хотите, чтобы переменная считалась строкой, сцепите ее с пустой строкой. Конвертирование строки в число производится с помощью atof(3). Конвертирование числа в строку производится с помощью sprintf(3), путем использования значения CONVFMT в качестве строки форматирования, и числового значения переменной в качестве аргумента. Хотя все числа в AWK считаются числами с плавающей запятой, целые значения всегда преобразуются как целые. Поэтому в
CONVFMT = "%2.2f" a = 12 b = a ""
Gawk выполняет сравнения следующим образом:
* если две переменные имеют числовое значение, то они сравниваются как числа;
* если одна переменная имеет числовое значение, а вторая является "строкой-числом" (т.е. строкой, состоящей из цифр),
то переменные сравниваются как числа. Во всех остальных случаях производится преобразование числа в строку, и переменные
сравниваются как строки. Две строки, естественно, сравниваются как строки. В соответствие со стандартом POSIX,
даже если две строки являются "строками-числами", то они сравниваются как числа. Но это, безусловно, неправильно, поэтому
gawk не делает этого.
Заметьте, что строковые константы, такие как "57", не являются "строками-числами", а именно строковыми константами.
Термин "строка-число" применим лишь к полям, входным данным getline, FILENAME, элементам ARGV,
элементам ENVIRON и тем элементам массива, созданного split, которые являются числовыми строками. Основная
идея в том, что таким образом интерпретируется только входная информация пользователя, выглядящая, как число.
Переменные, неинициализированные явно, имеют числовое значение 0 и строковое значение "" (пустая строка).
Имеются следующие операторы ввода/вывода:
В ранних версиях gawk использовалась конструкция next file. Хотя эта конструкция все еще распознается, выдается предупреждающее сообщение. В дальнешем она поддерживаться не будет.
pgawk принимает 2 вида сигналов. SIGUSR1 заставляет его сбросить профиль и стек вызовов функций в файл профиля, который называется awkprof.out, либо имя, указанное в опции --profile. Далее выполнение продолжается. SIGHUP заставляет его сбросить профиль и стек вызовов функций и затем выйти.
Напечатать и отсортировать логины всех пользователей:
BEGIN { FS = ":" } { print $1 | "sort" }
{ nlines++ } END { print nlines }
{ print FNR, $0 }
{ print NR, $0 }
tail -f access_log | awk '/myhome.html/ { system("nmap " $1 ">> logdir/myhome.html") }'
Строковые константы это последовательность символов, заключенных в двойные кавычки. В не-англоязычной языковой среде, можно помечать строки в тексте программы AWK как требующие перевода на местный язык. Такие строки помечаются подчеркиванием перед строкой ("_"). Например,
gawk 'BEGIN { print "hello, world" }'
gawk 'BEGIN { print _"hello, world" }'
Чтобы создать и запустить локализованную AWK программу, нужно сделать несколько шагов:
1. Добавьте действие BEGIN, чтобы присвоить значение переменной TEXTDOMAIN, чтобы установить текстовую область, связанную с именем вашей программы.
BEGIN { TEXTDOMAIN = "myprog" }
3. Если нужно, используйте функции dcgettext() и/или bindtextdomain() в вашей программе.
4. Выполните
gawk --gen-po -f myprog.awk > myprog.po
5. Сделайте нужные переводы и сделайте и установите соответствующий .mo-файл.
Более подробно процесс интернационализации описан в [http://www.gnu.org/manual/gawk GAWK: Effective AWK Programming] (GAWK: Эффективное программирование на AWK).
Главная задача для gawk - совместимость как с POSIX стандартом, так и с последней версией UNIX awk. Для этого, gawk включает в себя следующие функции, не описанные в Книге AWK, но входящие в Bell Laboratories версию awk, и имеющиеся в стандарте POSIX. В книге сказано, что присваивание значений переменным, указанным в командной строке, происходит перед открытием awk файла, что происходит после выполнения блока BEGIN. Однако в ранних реализациях, если такое присваивание значений переменным было указано до имен файлов, присваивание происходило до выполнения блока BEGIN. Эта "возможность" стала применяться в приложениях. После того, как awk был приведен в соответствие с документацией, для удовлетворения нужд приложений, зависимых от старого поведения, была добавлена опция -v. (С введением этой возможности согласились как разработчики AT&T, так и GNU.) Опция -W для реализации особенностей взята из стандарта POSIX.
При обработке аргументов gawk использует специальную опцию -- для указания конца аргументов. В режиме совместимости будет выдаваться предупреждение о существовании неизвестных опций, но они будут игнорироваться. В обычном режиме такие аргументы передаются для обработки программе AWK. В соответствие с книгой по AWK, значение, возвращаемое srand(), не определено. В стандарте POSIX возвращается предыдущее значение, что позволяет следить за последовательностью случайных чисел. Поэтому srand() в gawk также возвращает значение текущей базы. Другие новые возможности: использование нескольких опций -f (из MKS awk); массив ENVIRON; экранирующие последовательности \a и \v (изначально появившиеся в gawk и затем включенные в AT&T); функции tolower() и toupper() (из AT&T); параметры форматирования ANSI C printf (впервые появившиеся в версии AT&T).
Есть две функции исторических реализаций AWK, которые поддерживает gawk. Во-первых, можно вызывать встроенную функцию length() не только без аргументов, но и без скобок! Соответственно,
a = length # Holy Algol 60, Batman!
a = length() a = length($0)
Gawk имеет некоторые расширения по сравнению с POSIX-версией awk. Они описаны в этом разделе. Все эти расширения могут быть отключены вызовом gawk с опцией --traditional. Следующие функции gawk отсутствуют в POSIX awk.
* Не производится поиск по пути файлов, указанных через опцию -f. Как следствие, переменная окружения AWKPATH
не имеет специального значения. .br
* Экранирующая последовательность \x. (Отключается при использовании --posix.)
* Функция fflush(). (Отключается при использовании --posix.)
* Возможность продолжать строку после ? и :. (Отключается при использовании --posix.)
* Восьмеричные и шестнадцатиричные константы в AWK программах.
* Переменные ARGIND, BINMODE, ERRNO, LINT, RT и TEXTDOMAIN не являются особыми.
* Не обрабатывается переменная IGNORECASE.
* Переменная FIELDWIDTHS и разделение на поля с фиксированной шириной.
* Отсутствует массив PROCINFO.
* Использование RS как регулярных выражений.
* Специальные имена файлов для перенаправления ввода/вывода не распознаются.
* Оператор |& для создания со-процессов.
* Возможность разделения на отдельные символы путем присваивания пустого значения переменной FS или третьему
аргументу split(). .br
* Необязательный второй аргумент функции close().
* Необязательный третий аргумент функции match().
* Возможность использовать позиционные спецификаторы в printf и sprintf().
* Использование <TT>delete массив</TT> чтобы удалить всё содержимое массива.
* Использование nextfile для прерывания обработки текущего входного файла.
* Функции and(), asort(), asorti(), bindtextdomain(), compl(), dcgettext(),
dcngettext(), gensub(), lshift(), mktime(), or(), rshift(), strftime(),
strtonum(), systime() и xor(). .br
* Локализуемые строки.
* Динамическое добавление новых встроенных функций с помощью функции extension().
Книга AWK не определяет возвращаемое значение функции close(). Версия gawk возвращает значение, полученное от fclose(3), или pclose(3), когда закрывается выходной файл или канал, соответственно. Она возвращает выходное значение процесса, когда закрывается входной канал. Возвращаемое значение равно -1, если файл, канал или со-процесс не были открыты с перенаправлением. Если при запуске gawk с опцией --traditional, аргумент fs опции -F имеет значение "t", то значением FS будет символ табуляции. Заметьте, что .RS
gawk -F\t ...
gawk -F'\t' ...
Если при установке gawk была указана опция --enable-switch команде configure, тогда gawk понимает дополнительный оператор управления:
switch (expression) { case value|regex : statement ... [ default: statement ] }
Переменная окружения AWKPATH может быть использована для указания списка директорий, в которых gawk ищет файлы, указанные в опциях -f и --file. Если в переменных окружения присутствует POSIXLY_CORRECT, тогда gawk ведет себя, как если бы опция --posix была указана в командной строке. Если указана опция --lint, gawk выдает предупреждающее сообщение о таком эффекте.
The -F option is not necessary given the command line variable assignment feature; it remains only for backwards compatibility.
Syntactically invalid single character programs tend to overflow the parse stack, generating a rather unhelpful message.
Such programs are surprisingly difficult to diagnose in the completely general case, and the effort to do so really is not
worth it.
The original version of UNIX awk was designed and implemented by Alfred Aho, Peter Weinberger, and Brian Kernighan of Bell Laboratories. Brian Kernighan continues to maintain and enhance it.
Paul Rubin and Jay Fenlason, of the Free Software Foundation, wrote gawk, to be compatible with the original version of awk distributed in Seventh Edition UNIX. John Woods contributed a number of bug fixes. David Trueman, with contributions from Arnold Robbins, made gawk compatible with the new version of UNIX awk. Arnold Robbins is the current maintainer.
The initial DOS port was done by Conrad Kwok and Scott Garfinkle. Scott Deifik is the current DOS maintainer. Pat Rankin did the port to VMS, and Michal Jaegermann did the port to the Atari ST. The port to OS/2 was done by Kai Uwe Rommel, with contributions and help from Darrel Hankerson. Fred Fish supplied support for the Amiga, Stephen Davies provided the Tandem port, and Martin Brown provided the BeOS port.
Это руководство описывает gawk, версии 3.1.4.
* Игорь Чубин <igor ar chub.in>
Закладки на сайте Проследить за страницей |
Created 1996-2024 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |