Command: awk pattern matching language Синтаксис: awk rules [file] ... Flags: (нет) Примеры: awk rules input # Входящий input процесс согласно правилам rules Примеры: awk rules >out # Входящий процесс из терминала, выход как out AWK - язык программирования, который разработали Aho, Weinberger и Kernighan в Bell Labs. Awk производит поиск файлов определенного образца, и выполняет 'действия' для каждого найденного из этих образцов (шаблонов). В качестве образца могут быть 'регулярные выражения', используемые в редакторе текста ed. Действия представляют собой конструкции языка С. Образцы и действия обычно помещаются в файл 'правил', название которого должно быть первым аргументом в командной строке, которой предшествует флаг f. Иначе, из командной строки будет взят аргумент, который будет последовательностью, содержащей непосредственно правила. Все другие аргументы взяты для того, чтобы быть названиями текстовых файлов и правила для которых будут состоять в том, чтобы быть применеными, к стандартным входным данным. Чтобы назначить правила для стандартного входа, используйте f. Команда: awk rules prog.* прочитает образцы и действующие правила из (правил) rules файла и применит их ко всем аргументам. Общий формат файла правил: <pattern> { <action> } <pattern> { <action> } ... <образец> { <действие> } <образец> { <действие> } В файле правил может быть любое количество последовательностей <образец> { <действие> } Awk читает строку на входе из текущего входного файла и применяет каждый <образец> {действие} в последовательности к этой строке. Если <образец>, соответствующий какому-либо { <действие> } отсутствует, тогда действие применяется к каждой входящей строке. По умолчанию { <действие> } должно напечатать подобранную входящую строку. Образцы <образец> может состоять из любого действительного выражения языка C. Если <образец> состоит из двух выражений, отделенных запятой, то он взят, чтобы быть диапазоном, и <действие> будет выполнено на всех входящих строках, которые соответствуют диапазону. <образец> может содержать 'регулярные выражения', разграниченные @ символом. О регулярных выражениях можно говорить как обобщенном механизме соответствия последовательности 'набора символов', подобных используемым многими операционными системами для определения имена файла. Регулярные выражения могут включать следующие символы: x как простой символ \ наклонная черта влево (бэкслэш) указывает на любой смивол ^ циркумфлекс в начале выражения соответствует началу строки $ Знак доллара в конце выражения соответствует концу строки . соответстует любому символу, кроме символа новой строки * Выражение, сопровождаемое звездочкой, соответствует нолю или большему количеству выражаемого обозначения: 'fo*' matches 'f', 'fo', 'foo', 'fooo' и т.д. + Выражение, сопровождаемое знакjv плюс, соответствует одному или более включениям этого выражения: 'fo +' соответствует 'fo', 'foo', 'fooo', и т.д. [] Последовательность, описываемая в квадратных скобках, соответствует любому единственному символу в данной последовательности, но никаких других Если первый символ в последовательности - циркумфлекс, то выражение соответствует любому символу кроме newline (новая строка) и символам в строковой последовательности. Например, '[xyz]' соответствует 'xx' и'zyx', пока '[^xyz]' соответствует 'abc' но не'axb'. Диапазон может быть разделен двумя символами, разделяемыми '-'. Действия Действия выражены как подмножество языка C. Все переменные являются глобальными и по умолчанию не формально объявленны. Возможны только разрешенные символы, подмножества и указатели . Awk позволяет использовать только десятичным константы целого числа, запрещена hex (0xnn) или октальная (0nn) запись. Строковые и символьные константы могут содержать все специальное выходные C последовательности (\n, \r, и т.д.). Awk Awk поддерживает конструкции 'if', 'else', 'while' и 'break'ведущие себя также, как и в С. Также поддерживаются следующие унарные и бинарные операторы, перечисленные в последовательности с самым высоким или самым низким приоритетом: Оператор Тип Ассоциативное действие () [] unary left to right ! ~ ++ * & unary right to left * / % binary left to right + binary left to right << >> binary left to right < <= > >= binary left to right == != binary left to right & binary left to right ^ binary left to right | binary left to right && binary left to right || binary left to right = binary right to left Комментарии обозначенные символом '#' прекращают своё действие с началом первого символа новой строки. Стандартный комментарий вида '/*' '*/' не подерживается и результатом будет синтаксическая ошибка. Поля Когда awk читает строку из текущего входного файла, то при записи он автоматически разделяет его на 'области'(поля). Область - это просто последовательность из идущих друг за другом символов, разделяемых началом или концом строки, или же абзацем. Изначально в качетве разделителя - пробел и символ табуляции. Специальный унарный оператор '$' используется, чтобы сослаться на одну из областей в текущей входящей строке. Области пронумерованы, последовательно начинаясь с 1. Выражение '0$' ссылается на всю входящую строку. Аналогично и 'record separator' (разделитель записи) используется, чтобы определить конец входящей строки, первоначально это символ новой строки. Разделители области и записи могут быть изменены программно, после выполнения определённых действий. Многократно (свыше 10 раз) использовать разделители области разрешено, но только в одном разделителе записи. Области ведут себя точно как и последовательности; могут использоваться в том же самом контексте как множества символов. Эти 'множества',предположительно, быдут объявлены как: char ($n)[ 128 ]; Другими словами, их длинна 128 байт. Заметьте, что круглые скобки необходимы, потому что операторы [] и $ связываются справа налево; без них утверждение выглядело бы как: char $(1[ 128 ]); а это не имеет смысла и совсем не то, что нам нужно. Если содержание одного из этих областей множеств изменено, то '$0' область отразит это изменение. Например, следующее выражение: *$4 = 'A'; изменит первый символ четвертой области (поля)к прописной букве. Тогда, когда следующая входящая линия: 120 PRINT "Name address Zip" будет обработана и набрана следующим образом: 120 PRINT "Name Address Zip" Области могут быть также изменены с помощью функции strcpy ()(см. ниже). Например, выражение: strcpy( $4, "Addr." ); относящееся к той же самой строке выше, выдаст: 120 PRINT "Name Addr. Zip" Предопределенные Переменные Следующие переменные предопределены: FS Разделитель поля (см. ниже) RS Разделитель записи (см. ниже). NF Количество полей в текущей входящей записи строки NR Число записей, обработанных на текущий момент FILENAME Наименование текущего входящего файла BEGIN Специальный <образец>, соответствующий началу входного текста END Специальный <pattern> tсоответствующий окончанию входного текста Awk также включает несколько функций для работы со строками и отображением их на экране: print(arg) простая печать строковых последовательностей, с прерыванием '\n'. printf(arg...) в точности printf() функция для C. getline() Читает следующую запись и возвращается к 0 в конце файла. nextfile() Закрывает текущий входной файл и начинает обрабатывать следующий strlen(s) Возвращает длину аргумента строки. strcpy(s,t) Копирует строку 't' в строку 's'. strcmp(s,t) Сравнивает 's' с 't' и в случае соответствия,возвращает 0. toupper(c) Возвращает символ аргумента, преобразованный в заглавные буквы. tolower(c) Возвращает символ аргумента, преобразованный в строчные буквы. match(s,@re@) Сравнивает последовательность 's' с регулярным выражением 'rе' и возвращает число найденных совпадений (ноль если не найдено). Авторы Awk был написан Saeko Hirabauashi и Kouichi Hirabayashi.