Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

AWK ( awk ) [4] - это предметно-ориентированный язык, разработанный для обработки текста и обычно используемый в качестве инструмента для извлечения данных и создания отчетов. Как СЭД и Grep , это фильтр , [4] и является стандартной особенностью большинства Unix-подобных операционных систем .

Язык AWK - это управляемый данными язык сценариев, состоящий из набора действий, которые должны выполняться с потоками текстовых данных - либо запускаться непосредственно в файлах, либо использоваться как часть конвейера - для целей извлечения или преобразования текста, например создания форматированного текста. отчеты. В языке широко используются строковый тип данных , ассоциативные массивы (то есть массивы, индексированные ключевыми строками) и регулярные выражения . Хотя AWK имеет ограниченную предполагаемую область приложения и был специально разработан для поддержки однострочных программ , язык является полным по Тьюрингу., и даже первые пользователи Bell Labs AWK часто писали хорошо структурированные большие программы AWK. [5]

AWK был создан в Bell Labs в 1970-х [6] [ необходим лучший источник ], и его название происходит от фамилий его авторов: Альфред Ахо , Питер Вайнбергер и Брайан Керниган . Аббревиатура произносится так же, как и птичья аук на обложке AWK Programming Language . [7] Когда написано строчными буквами, as awkозначает программу Unix или Plan 9, которая запускает сценарии, написанные на языке программирования AWK.

История [ править ]

AWK был первоначально разработан в 1977 году Альфредом Ахо (автором egrep ), Питером Дж. Вайнбергером (который работал над крошечными реляционными базами данных) и Брайаном Керниганом ; он получил свое название от их соответствующих инициалов. По словам Кернигана, одной из целей AWK было создание инструмента, который бы легко манипулировал как числами, так и строками. AWK также был вдохновлен языком программирования Марка Рочкинда, который использовался для поиска шаблонов во входных данных и был реализован с использованием yacc . [8]

Как один из первых инструментов, появившихся в версии 7 Unix , AWK добавил вычислительные функции в конвейер Unix помимо оболочки Bourne , единственного языка сценариев, доступного в стандартной среде Unix. Это одна из обязательных утилит Единой спецификации UNIX , [9] и требуется спецификацией Linux Standard Base . [10]

AWK был значительно переработан и расширен в 1985–88 гг., В результате чего в 1988 г. была выпущена реализация GNU AWK, написанная Полом Рубином , Джеем Фенласоном и Ричардом Столлманом . [11] GNU AWK может быть наиболее широко применяемой версией [12], поскольку она входит в состав пакетов Linux на основе GNU. GNU AWK была сохранена исключительно Arnold Robbins с 1994 года [11] Брайан Керниган «s nawk источник (New AWK) был впервые выпущен в 1993 негласная и публично с конца 1990 - х годов; многие системы BSD используют его, чтобы избежать лицензии GPL. [11]

AWK предшествовал sed (1974). Оба были предназначены для обработки текста. Они разделяют парадигму, ориентированную на строки, управляемую данными, и особенно подходят для написания однострочных программ из-за неявных переменных основного цикла и текущей строки. Мощь и краткость ранних программ AWK - особенно мощная обработка регулярных выражений и лаконичность, обусловленная неявными переменными, которые упрощают однострочность - вместе с ограничениями AWK в то время были важными источниками вдохновения для языка Perl (1987). В 1990-е годы Perl стал очень популярным, конкурируя с AWK в нише языков обработки текста Unix.

Структура программ AWK [ править ]

AWK читает ввод построчно. Линия сканируется для каждого шаблона в программе, и для каждого совпадающего шаблона выполняется соответствующее действие.

-  Альфред В. Ахо [13]

Программа AWK представляет собой серию пар действий шаблона, записанных как:

условие  {  действие  } условие  {  действие  } ...

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

В дополнение к простому выражению AWK, такому как foo == 1или /^foo/, условие может быть BEGINили ENDвызывать выполнение действия до или после того, как все записи были прочитаны, или шаблон1, шаблон2, который соответствует диапазону записей, начиная с записи, соответствующей шаблону1 вверх до и включая запись, которая соответствует шаблону2, прежде чем снова пытаться сопоставить с шаблоном1 в будущих строках.

Помимо обычных арифметических и логических операторов, выражения AWK включают оператор тильды ~, который сопоставляет регулярное выражение со строкой. Как удобный синтаксический сахар , / регулярное выражение / без использования спичек оператора тильды против текущей записи; этот синтаксис унаследован от sed , который, в свою очередь, унаследовал его от редактора ed , /который используется для поиска. Этот синтаксис использования слэшей в качестве разделителей для регулярных выражений был впоследствии принят Perl и ECMAScript и теперь является общепринятым. Оператор тильды также был принят в Perl.

Команды [ править ]

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

Печать команды [ править ]

Команда печати используется для вывода текста. Выходной текст всегда заканчивается предопределенной строкой, которая называется разделителем выходной записи (ORS), значением по умолчанию является новая строка. Самая простая форма этой команды:

print
Это отображает содержимое текущей записи. В AWK записи разбиты на поля , и они могут отображаться отдельно:
print $1
Отображает первое поле текущей записи
print $1, $3
Отображает первое и третье поля текущей записи, разделенные предопределенной строкой, называемой разделителем выходных полей (OFS), значением по умолчанию является один символ пробела.

Хотя эти поля ( $ X ) могут иметь сходство с переменными (символ $ обозначает переменные в Perl ), на самом деле они относятся к полям текущей записи. Особый случай, $ 0 , относится ко всей записи. Фактически, команды " print" и " print $0" идентичны по функциональности.

Команда печати также может отображать результаты вычислений и / или вызовов функций:

/ regex_pattern /  {  # Действия для выполнения в случае , если запись (строка) соответствует указанной выше regex_pattern  печати  3 + -  печать  Foobar ( 3 )  печать  Foobar ( переменный )  печать  грех ( 3 - 2 ) }

Вывод может быть отправлен в файл:

/ regex_pattern /  {  # Действия, выполняемые в случае, если запись (строка) совпадает с указанным выше regex_pattern  print  "выражение"  >  "имя файла" }

или через трубу :

/ regex_pattern /  {  # Действия, выполняемые в случае, если запись (строка) совпадает с указанным выше regex_pattern  print  "expression"  |  "команда" }

Встроенные переменные [ править ]

Встроенные переменные Awk включают переменные поля: $ 1, $ 2, $ 3 и т. Д. ($ 0 представляет всю запись). Они содержат текст или значения в отдельных текстовых полях записи.

Другие переменные включают:

  • NR: 'N'umber of' R'ecords: сохраняет текущий счет количества входных записей, прочитанных на данный момент из всех файлов данных. Он начинается с нуля, но никогда не сбрасывается автоматически до нуля. [14]
  • FNR: 'F'ile' N'umber of 'R'ecords: сохраняет текущий счет количества входных записей, прочитанных на данный момент в текущем файле. Эта переменная автоматически сбрасывается в ноль при каждом запуске нового файла. [14]
  • NF: 'N'umber of' F'ields: содержит количество полей в текущей входной записи. Последнее поле во входной записи может быть обозначено $ NF, предпоследнее поле - $ (NF-1), предпоследнее поле - $ (NF-2) и т. Д.
  • FILENAME: Содержит имя текущего входного файла.
  • FS: 'F'ield' S'eparator: содержит символ «разделитель полей», используемый для разделения полей во входной записи. По умолчанию «пробел» включает любые символы пробела и табуляции. FS можно переназначить другому символу, чтобы изменить разделитель полей.
  • RS: 'R'ecord' S'eparator: сохраняет текущий символ "разделителя записей". Поскольку по умолчанию входная строка является входной записью, символ разделителя записей по умолчанию - «новая строка».
  • OFS: 'O'utput' F'ield 'S'eparator: хранит «разделитель выходных полей», который разделяет поля, когда Awk их печатает. По умолчанию используется символ «пробел».
  • ORS: 'O'utput' R'ecord 'S'eparator: хранит «разделитель выходных записей», который разделяет выходные записи, когда Awk их печатает. По умолчанию используется символ новой строки.
  • OFMT: 'O'utput' F'or'M'a'T ': сохраняет формат для числового вывода. Формат по умолчанию - «% .6g».

Переменные и синтаксис [ править ]

В именах переменных можно использовать любые символы [A-Za-z0-9_], за исключением ключевых слов языка. Операторы + - * / представляют собой сложение, вычитание, умножение и деление соответственно. Для конкатенации строк просто поместите две переменные (или строковые константы) рядом друг с другом. Необязательно использовать пробел между ними, если задействованы строковые константы, но для двух имен переменных, расположенных рядом друг с другом, требуется пробел между ними. Строковые константы разделяются двойными кавычками . Заявления не должны заканчиваться точкой с запятой. Наконец, к программам можно добавлять комментарии, используя # в качестве первого символа в строке.

Пользовательские функции [ править ]

В формате, аналогичном C , определения функций состоят из ключевого слова function, имени функции, имен аргументов и тела функции. Вот пример функции.

function  add_three  ( number )  {  return  number  +  3 }

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

( шаблон ) {  print  add_three ( 36 )  # Выводит '' '39' '' }

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

Примеры [ править ]

Привет, мир [ править ]

Вот обычная программа " Hello, world ", написанная на AWK:

НАЧАТЬ  {  print  "Привет, мир!"  }

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

Печатать строки длиннее 80 символов [ править ]

Печатать все строки длиннее 80 символов. Обратите внимание, что действие по умолчанию - распечатать текущую строку.

длина ( $ 0 )  >  80

Подсчитать слова [ править ]

Подсчитайте слова во вводе и выведите количество строк, слов и символов (например, wc ):

{  words  + =  NF  chars  + =  length  +  1  # добавить один, чтобы учесть символ новой строки в конце каждой записи (строки) } END  {  вывести  NR ,  слова ,  символы  }

Поскольку для первой строки программы нет шаблона, каждая строка ввода соответствует по умолчанию, поэтому действия приращения выполняются для каждой строки. Обратите внимание, что words += NFэто сокращение для words = words + NF.

Суммировать последнее слово [ править ]

{  s  + =  $ NF  } END  {  print  s  +  0  }

s увеличивается на числовое значение $ NF , которое является последним словом в строке, как определено разделителем полей AWK (по умолчанию, пробел). NF - это количество полей в текущей строке, например 4. Поскольку $ 4 - это значение четвертого поля, $ NF - это значение последнего поля в строке, независимо от того, сколько полей в этой строке или их больше. или меньше полей, чем окружающие линии. $ на самом деле является унарным оператором с наивысшим приоритетом оператора . (Если в строке нет полей, тогда NF равно 0, $ 0 - это вся строка, которая в этом случае пуста, за исключением возможных пробелов, и поэтому имеет числовое значение 0.)

В конце ввода соответствует шаблон END , поэтому печатается s . Однако, поскольку строк ввода могло не быть вообще, и в этом случае s не было присвоено никакого значения , по умолчанию это будет пустая строка. Добавление нуля к переменной - это идиома AWK для приведения ее из строки к числовому значению. (Объединение пустой строки означает приведение числа к строке, например, s "" . Обратите внимание, что нет оператора для объединения строк, они просто помещаются рядом.) С помощью принуждения программа печатает "0" на пустом вводе. , без него печатается пустая строка.

Соответствует диапазону входных строк [ править ]

NR  %  4  ==  1 ,  NR  %  4  ==  3  {  printf  "% 6d% s \ n" ,  NR ,  $ 0  }

Оператор действия печатает каждую пронумерованную строку. Функция printf эмулирует стандартный printf Си и работает аналогично команде печати, описанной выше. Однако шаблон для сопоставления работает следующим образом: NR - это количество записей, обычно строк ввода, которые AWK уже прочитал, то есть номер текущей строки, начиная с 1 для первой строки ввода. % - оператор по модулю . NR% 4 == 1 верно для 1-й, 5-й, 9-й и т. Д. Строк ввода. Аналогично, NR% 4 == 3верно для 3-й, 7-й, 11-й и т. д. строк ввода. Шаблон диапазона является ложным до совпадения первой части в строке 1, а затем остается верным до совпадения второй части в строке 3 включительно. Затем он остается ложным до тех пор, пока первая часть не совпадет снова в строке 5.

Таким образом, программа печатает строки 1,2,3, пропускает строку 4, затем 5,6,7 и так далее. Для каждой строки он печатает номер строки (в поле шириной 6 символов), а затем содержимое строки. Например, при выполнении на этом входе:

РимФлоренцияМиланНеапольТуринВенеция

Предыдущая программа печатает:

 1 Рим 2 Флоренция 3 Милан 5 Турин 6 Венеция

Печать начальной или последней части файла [ править ]

В качестве особого случая, когда первая часть шаблона диапазона всегда истинна, например 1 , диапазон начинается с начала ввода. Точно так же, если вторая часть постоянно ложна, например 0 , диапазон будет продолжаться до конца ввода. Например,

 / ^ - вырезать здесь - $ / ,  0

выводит строки ввода из первой строки, соответствующей регулярному выражению ^ - cut here - $ , то есть строку, содержащую только фразу «--cut here--», до конца.

Вычислить частоту слов [ править ]

Частота слов с использованием ассоциативных массивов :

BEGIN  {  FS = "[^ a-zA-Z] +" } {  для  ( i = 1 ;  i <= NF ;  i ++ )  слов [ tolower ( $ i )] ++ } END  {  для  ( i  в  словах )  выведите  i ,  words [ i ] }

Блок BEGIN устанавливает разделитель полей на любую последовательность неалфавитных символов. Обратите внимание, что разделители могут быть регулярными выражениями. После этого мы переходим к простому действию, которое выполняет действие для каждой строки ввода. В этом случае для каждого поля в строке мы добавляем единицу к количеству появлений этого слова, сначала преобразованного в нижний регистр. Наконец, в блоке END мы печатаем слова с их частотами. Линия

для (я прописью)

создает цикл, который перебирает слова массива , устанавливая i для каждого индекса массива. Это отличается от большинства языков, где такой цикл проходит через каждое значение в массиве. Таким образом, цикл выводит каждое слово, за которым следует его частота. tolowerбыл дополнением к One True awk (см. ниже), сделанным после публикации книги.

Шаблон соответствия из командной строки [ править ]

Эту программу можно представить несколькими способами. Первый использует оболочку Bourne для создания сценария оболочки, который делает все. Это самый короткий из этих методов:

#! / bin / shpattern = " $ 1 " shift
awk '/' " $ pattern " '/ {print FILENAME ":" $ 0}'  " $ @ "

Команда $patternawk не защищена одинарными кавычками, поэтому оболочка расширяет переменную, но ее нужно заключить в двойные кавычки, чтобы правильно обрабатывать шаблоны, содержащие пробелы. Шаблон сам по себе обычным способом проверяет, соответствует ли вся строка ( $0). FILENAMEсодержит текущее имя файла. awk не имеет явного оператора конкатенации; две соседние строки соединяют их. $0расширяется до исходной неизмененной строки ввода.

Есть альтернативные способы написать это. Этот сценарий оболочки обращается к среде напрямую из awk:

#! / bin / shexport  pattern = " $ 1 " shift
awk '$ 0 ~ ENVIRON ["pattern"] {print FILENAME ":" $ 0}'  " $ @ "

Это сценарий оболочки, который использует ENVIRONмассив, представленный в более новой версии One True awk после публикации книги. Нижний индекс ENVIRON- это имя переменной среды; его результат - значение переменной. Это похоже на функцию getenv в различных стандартных библиотеках и POSIX . Сценарий оболочки создает переменную среды, patternсодержащую первый аргумент, затем отбрасывает этот аргумент и заставляет awk искать шаблон в каждом файле.

~проверяет, совпадает ли его левый операнд с правым операндом; !~это его обратное. Обратите внимание, что регулярное выражение - это просто строка и может храниться в переменных.

Следующий способ использует присвоение переменной из командной строки, в котором аргумент awk можно рассматривать как присвоение переменной:

#! / bin / shpattern = " $ 1 " shift
awk '$ 0 ~ pattern {print FILENAME ":" $ 0}'  "pattern = $ pattern "  " $ @ "

Или Вы можете использовать параметр командной строки -v var = value (например, awk -v pattern = "$ pattern" ... ).

Наконец, это написано на чистом awk, без помощи оболочки или без необходимости слишком много знать о реализации сценария awk (как это делается при назначении переменных в командной строке), но это немного длинно:

BEGIN  {  pattern  =  ARGV [ 1 ]  for  ( i  =  1 ;  i  <  ARGC ;  i ++ )  # удалить первый аргумент  ARGV [ i ]  =  ARGV [ i  +  1 ]  ARGC -  if  ( ARGC  ==  1 )  {  # шаблон был единственным, поэтому принудительное чтение из стандартного ввода (используется книгой)  ARGC  =  2  ARGV [ 1 ]  = "-"  } } $ 0  ~  шаблон  {  print  FILENAME  ":"  $ 0  }

Это BEGINнеобходимо не только для извлечения первого аргумента, но и для предотвращения его интерпретации как имени файла после завершения BEGINблока. ARGC, количество аргументов всегда гарантированно будет ≥1, как ARGV[0]и имя команды, которая выполнила сценарий, чаще всего строка "awk". Также обратите внимание, что ARGV[ARGC]это пустая строка "". #инициирует комментарий, который расширяется до конца строки.

Обратите внимание на ifблок. awk только проверяет, следует ли читать из стандартного ввода, прежде чем запускать команду. Это значит, что

awk 'прога'

работает только потому, что факт отсутствия имен файлов проверяется только перед progзапуском! Если вы явно установите ARGCзначение 1, чтобы не было аргументов, awk просто завершит работу, потому что чувствует, что входных файлов больше нет. Следовательно, вам нужно явно указать, что нужно читать со стандартного ввода со специальным именем файла -.

Автономные сценарии AWK [ править ]

В Unix-подобных операционных системах автономные сценарии AWK могут быть созданы с использованием синтаксиса shebang .

Например, сценарий, который печатает содержимое данного файла, может быть построен путем создания файла с именем print.awkсо следующим содержимым:

#! / usr / bin / awk -f {  печать  $ 0  }

Его можно вызвать с помощью: ./print.awk <filename>

Он -fсообщает AWK, что следующий аргумент - это файл, из которого следует читать программу AWK, что является тем же флагом, который используется в sed. Поскольку они часто используются для однострочников, обе эти программы по умолчанию выполняют программу, заданную как аргумент командной строки, а не отдельный файл.

Версии и реализации [ править ]

AWK был первоначально написан в 1977 году и распространялся с версией 7 Unix .

В 1985 году его авторы начали расширять язык, в первую очередь добавляя определяемые пользователем функции. Язык описан в книге The AWK Programming Language , опубликованной 1988, и его реализация была доступна в версиях UNIX System V . Чтобы избежать путаницы с несовместимой более старой версией, эту версию иногда называли «новой awk» или nawk . Эта реализация была выпущена под лицензией свободных программ в 1996 году и до сих пор поддерживается Брайаном Керниганом (см. Внешние ссылки ниже). [ необходима цитата ]

Включены старые версии Unix, такие как UNIX / 32V , awkccкоторые преобразовывали AWK в C. Керниган написал программу для преобразования awk в C ++; его состояние неизвестно. [15]

  • BWK awk , также известный как nawk , относится к версии Брайана Кернигана . Он был назван «One True AWK» из-за использования этого термина в связи с книгой, которая первоначально описывала язык, и того факта, что Керниган был одним из первых авторов AWK. [7] FreeBSD называет эту версию one-true-awk . [16] В этой версии также есть функции, которых нет в книге, например, tolowerи ENVIRONкоторые описаны выше; подробности см. в файле FIXES в исходном архиве. Эта версия используется, например, в Android , FreeBSD , NetBSD , OpenBSD , macOS., и иллюмос . Брайан Керниган и Арнольд Роббинс являются основными участниками репозитория исходного кода для nawk : github .com / onetrueawk / awk .
  • gawk ( GNU awk) - еще одна реализация свободного программного обеспечения и единственная реализация, которая добилась серьезного прогресса в реализации интернационализации и локализации, а также сетей TCP / IP. Он был написан до того, как исходная реализация стала общедоступной. Он включает собственный отладчик, а его профилировщик позволяет пользователю изменять производительность сценария. Это также позволяет пользователю расширять функциональность с помощью общих библиотек. Некоторые дистрибутивы Linux включают gawk в качестве реализации AWK по умолчанию. [ необходима цитата ]
    • gawk-csv . Расширение CSV для gawk предоставляет средства для обработки входных и выходных данных в формате CSV. [17]
  • mawk - это очень быстрая реализация AWK Майка Бреннана, основанная на интерпретаторе байт-кода .
  • libmawk - это ответвление mawk, позволяющее приложениям встраивать несколько параллельных экземпляров интерпретаторов awk.
  • awka (интерфейс которой написан поверх программы mawk ) - еще один транслятор сценариев AWK в код C. При компиляции со статическим включением авторского libawka.a результирующие исполняемые файлы значительно ускоряются и, согласно тестам автора, очень хорошо сравниваются с другими версиями AWK, Perl или Tcl . Маленькие скрипты превратятся в программы размером 160–170 КБ.
  • tawk (Thompson AWK) - компилятор AWK для Solaris , DOS , OS / 2 и Windows , ранее продаваемый Thompson Automation Software (которая прекратила свою деятельность). [18]
  • Jawk - это проект по реализации AWK на Java , размещенный на SourceForge. [19] Добавлены расширения к языку для обеспечения доступа к функциям Java в сценариях AWK (т. Е. Потокам Java, сокетам, коллекциям и т. Д.).
  • xgawk - это форк gawk [20], который расширяет gawk динамически загружаемыми библиотеками. Расширение XMLgawk было интегрировано в официальный выпуск 4.1.0 GNU Awk.
  • QSEAWK - это реализация встроенного интерпретатора AWK, включенная в библиотеку QSE, которая обеспечивает встраивание интерфейса прикладного программирования (API) для C и C ++ . [21]
  • libfawk - это очень маленький, реентерабельный, встраиваемый интерпретатор только для функций, написанный на C
  • BusyBox включает реализацию AWK, написанную Дмитрием Захаровым. Это очень маленькая реализация, подходящая для встраиваемых систем.

Книги [ править ]

  • Ахо, Альфред В .; Керниган, Брайан В .; Вайнбергер, Питер Дж. (1988-01-01). Язык программирования AWK . Нью-Йорк, Нью-Йорк: Аддисон-Уэсли . ISBN 0-201-07981-X. Проверено 22 января 2017 .
  • Роббинс, Арнольд (2001-05-15). Эффективное программирование на awk (3-е изд.). Севастополь, Калифорния: O'Reilly Media . ISBN 0-596-00070-7. Проверено 16 апреля 2009 .
  • Догерти, Дейл ; Роббинс, Арнольд (1997-03-01). sed и awk (2-е изд.). Севастополь, Калифорния: O'Reilly Media. ISBN 1-56592-225-5. Проверено 16 апреля 2009 .
  • Роббинс, Арнольд (2000). Эффективное программирование Awk: Руководство пользователя Gnu Awk (1.0.3 ред.). Блумингтон, IN: iUniverse . ISBN 0-595-10034-1. Архивировано 12 апреля 2009 года . Проверено 16 апреля 2009 .

См. Также [ править ]

  • Преобразование данных
  • Событийно-ориентированное программирование
  • Список команд Unix
  • sed

Ссылки [ править ]

  1. ^ Штутц, Майкл (19 сентября 2006). «Начало работы с GAWK: основы языка AWK» (PDF) . developerWorks . IBM . Проверено 29 января 2015 . [AWK] часто называют языком, управляемым данными - операторы программы описывают входные данные для сопоставления и обработки, а не последовательность шагов программы.
  2. Андреас Дж. Пилавакис (1989). UNIX Workshop . Международное высшее образование Macmillan. п. 196.
  3. ^ Арнольд Роббинс (2015). Эффективное Awk-программирование: универсальная обработка текста и сопоставление с образцом (4-е изд.). O'Reilly Media. п. 560.
  4. ^ a b Джеймс В. Ливингстон (2 мая 1988 г.). «Великая программа awk - это не птичий мозг». Цифровой обзор . п. 91.
  5. ^ Раймонд, Эрик С. «Применение мини-языков» . Искусство программирования Unix . Пример использования: awk. Архивировано из оригинала на 30 июля 2008 года . Проверено 11 мая 2010 года . Язык действий awk является полным по Тьюрингу и может читать и записывать файлы.
  6. ^ Ахо, Альфред В .; Керниган, Брайан В .; Вайнбергер, Питер Дж. (1 сентября 1978 г.). Awk - язык сканирования и обработки шаблонов (второе издание) (Технический отчет). Седьмое издание руководства по Unix, том 2. Bell Telephone Laboratories, Inc.
  7. ^ a b Ахо, Альфред В .; Керниган, Брайан В .; Вайнбергер, Питер Дж. (1988). Язык программирования AWK . Издательство Эддисон-Уэсли. ISBN 9780201079814. Дата обращения 16 мая 2015 .
  8. ^ "UNIX Special: Профс Керниган и Брейлсфорд" . Компьютерил . 30 сентября 2015 года.
  9. ^ «Единая спецификация UNIX, версия 3, таблица интерфейса утилит» . Архивировано из оригинала на 2018-01-05 . Проверено 18 декабря 2005 .
  10. ^ «Глава 15. Команды и утилиты». Linux Standard Base Core Specification 4.0 (Технический отчет). Linux Foundation. 2008 г.
  11. ^ a b c Роббинс, Арнольд (март 2014 г.). «Проект GNU и я: 27 лет с GNU AWK» (PDF) . skeeve.com . Проверено 4 октября 2014 года .
  12. ^ Догерти, Дейл; Роббинс, Арнольд (1997). sed и awk (2-е изд.). Севастополь, Калифорния: О'Рейли. п. 221. ISBN. 1-565-92225-5.
  13. Гамильтон, Наоми (30 мая 2008 г.). «Азия языков программирования: AWK» . Компьютерный мир . Проверено 12 декабря 2008 .
  14. ^ a b https://www.gnu.org/software/gawk/manual/html_node/Records.html#index-FNR-variable
  15. ^ Керниган, Brian W. (24-25 апреля 1991). Переводчик AWK в C ++ (PDF) . Конференция Usenix C ++. Вашингтон. С. 217–228.
  16. ^ "Рабочий журнал FreeBSD для импорта BWK awk в ядро ​​FreeBSD" . 16 мая 2005 года. Архивировано 8 сентября 2013 года . Проверено 20 сентября 2006 года .
  17. ^ Документация по gawk-csv на http://gawkextlib.sourceforge.net/csv/gawk-csv.html
  18. Джеймс К. Лоулесс (1 мая 1997 г.). «Изучение компилятора TAWK» . Журнал доктора Добба .
  19. ^ Jawk на SourceForge
  20. ^ Домашняя страница xgawk
  21. ^ QSEAWK на GitHub

Дальнейшее чтение [ править ]

  • Гамильтон, Наоми (30 мая 2008 г.). «Азия языков программирования: AWK» . Компьютерный мир . Проверено 12 декабря 2008 . - Интервью с Альфредом В. Ахо на AWK
  • Роббинс, Дэниел (2000-12-01). «Awk by example, Часть 1: Введение в великий язык со странным названием» . Общие темы . IBM DeveloperWorks . Проверено 16 апреля 2009 .
  • Роббинс, Дэниел (2001-01-01). «Пример на примере. Часть 2: Записи, циклы и массивы» . Общие темы . IBM DeveloperWorks . Проверено 16 апреля 2009 .
  • Роббинс, Дэниел (2001-04-01). "Не знаю, например, Часть 3: Строковые функции и ... чековые книжки?" . Общие темы . IBM DeveloperWorks. Архивировано 19 мая 2009 года . Проверено 16 апреля 2009 .
  • AWK - станьте экспертом за 60 минут
  • awk: язык сканирования и обработки шаблонов - Справочник по командам и служебным программам, Спецификация Single UNIX , Выпуск 7 от The Open Group
  • gawk(1) -  Linux пользователя Руководство Команды пользователя -
  • Gawkinet : межсетевое взаимодействие TCP / IP с Gawk

Внешние ссылки [ править ]

  • Удивительный Awk Assembler по Генри Спенсер .
  • AWK в Керли
  • awklang.org Сайт о вещах, связанных с языком awk