Jump to content

АВК

(Перенаправлено с языка программирования Awk )
АВК
Парадигма Скрипты , процедурные , управляемые данными [1]
Разработано Альфред Ахо , Питер Вайнбергер и Брайан Керниган
Впервые появился 1977 год ; 47 лет назад ( 1977 )
Стабильная версия
IEEE Std 1003.1-2008 (POSIX)/1985 г.
Дисциплина набора текста никто; может обрабатывать строки, целые числа и числа с плавающей запятой; регулярные выражения
ТЫ Кросс-платформенный
Основные реализации
awk, GNU Awk, mawk, nawk, MKS AWK, Thompson AWK (компилятор), Awka (компилятор)
Диалекты
старый awk oawk 1977 года, новый awk nawk 1985 года, GNU Awk gawk
Под влиянием
С , СЭД , СНОБОЛ [2] [3]
Под влиянием
Tcl , AMPL , Perl , Korn Shell ( ksh93 , dtksh , tksh ), Lua

AWK ( / ɔː k / [4] ) — это предметно-ориентированный язык, предназначенный для обработки текста и обычно используемый в качестве инструмента извлечения данных и составления отчетов. Подобно sed и grep , это фильтр . [4] и является стандартной функцией большинства Unix-подобных операционных систем .

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

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

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

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

В 1983 году AWK был одним из нескольких инструментов UNIX, доступных для операционной системы UNOS компании Charles River Data Systems по лицензии Bell Laboratories . [11]

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

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

Структура программ AWK

[ редактировать ]

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

—  Alfred V. Aho [14]

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

condition { action }
condition { action }
...

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

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

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

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

Команда печати

[ редактировать ]

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

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

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

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

/regex_pattern/ {
    # Actions to perform in the event the record (line) matches the above regex_pattern
    print 3+2
    print foobar(3)
    print foobar(variable)
    print sin(3-2)
}

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

/regex_pattern/ {
    # Actions to perform in the event the record (line) matches the above regex_pattern
    print "expression" > "file name"
}

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

/regex_pattern/ {
    # Actions to perform in the event the record (line) matches the above regex_pattern
    print "expression" | "command"
}

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

[ редактировать ]

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

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

  • NR: Количество записей. Сохраняет текущий подсчет количества входных записей, прочитанных на данный момент из всех файлов данных. Он начинается с нуля, но никогда не сбрасывается автоматически на ноль. [15]
  • FNR: Количество записей в файле. Сохраняет текущий подсчет количества входных записей, прочитанных на данный момент в текущем файле. Эта переменная автоматически обнуляется каждый раз при запуске нового файла. [15]
  • NF: Количество полей. Содержит количество полей в текущей входной записи. Последнее поле во входной записи может быть обозначено $NF, предпоследнее поле — $(NF-1), предпоследнее поле — $(NF-2) и т. д.
  • FILENAME: Содержит имя текущего входного файла.
  • FS: Разделитель полей. Содержит «разделитель полей», используемый для разделения полей во входной записи. По умолчанию «пробелы» допускают любую последовательность пробелов и символов табуляции. FS можно переназначить с помощью другого символа или последовательности символов, чтобы изменить разделитель полей.
  • RS: Разделитель записей. Сохраняет текущий символ «разделителя записей». Поскольку по умолчанию строка ввода является входной записью, символом-разделителем записей по умолчанию является «новая строка».
  • OFS: Разделитель выходных полей. Хранит «разделитель выходных полей», который разделяет поля, когда Awk их печатает. По умолчанию используется символ «пробел».
  • ORS: Разделитель выходных записей. Хранит «разделитель выходных записей», который разделяет выходные записи, когда Awk их печатает. По умолчанию используется символ «новой строки».
  • OFMT: Формат вывода. Сохраняет формат числового вывода. Формат по умолчанию — "%.6g".

Переменные и синтаксис

[ редактировать ]

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

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

[ редактировать ]

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

function add_three (number) {
    return number + 3
}

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

(pattern) {
   print add_three(36)     # Outputs '''39'''
}

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

Привет, мир!

[ редактировать ]

Вот привычное «Привет, Мир!» программа, написанная на AWK:

BEGIN {
        print "Hello, world!"
        exit
}
[ редактировать ]

Выведите все строки длиной более 80 символов. Действием по умолчанию является печать текущей строки.

length($0) > 80

Подсчитайте слова

[ редактировать ]

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

{
    words += NF
    chars += length + 1 # add one to account for the newline character at the end of each record (line)
}
END { print NR, words, chars }

Поскольку для первой строки программы нет шаблона, каждая строка ввода соответствует по умолчанию, поэтому действия по увеличению выполняются для каждой строки. 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 языка C и работает аналогично команде печати, описанной выше. Однако шаблон для сопоставления работает следующим образом: 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 символов), а затем ее содержимое. Например, при выполнении на этом входе:

Rome
Florence
Milan
Naples
Turin
Venice

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

     1 Rome
     2 Florence
     3 Milan
     5 Turin
     6 Venice

Печать начальной или конечной части файла

[ редактировать ]

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

 /^--cut here--$/, 0

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

Рассчитать частоту слов

[ редактировать ]

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

BEGIN {
    FS="[^a-zA-Z]+"
}
{
    for (i=1; i<=NF; i++)
        words[tolower($i)]++
}
END {
    for (i in words)
        print i, words[i]
}

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

for (i in words)

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

Сопоставить шаблон из командной строки

[ редактировать ]

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

#!/bin/sh

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

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

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

#!/bin/sh

export pattern="$1"
shift
awk '$0 ~ ENVIRON["pattern"] { print FILENAME ":" $0 }' "$@"

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

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

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

#!/bin/sh

pattern="$1"
shift
awk '$0 ~ pattern { print FILENAME ":" $0 }' "pattern=$pattern" "$@"

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

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

BEGIN {
    pattern = ARGV[1]
    for (i = 1; i < ARGC; i++) # remove first argument
        ARGV[i] = ARGV[i + 1]
    ARGC--
    if (ARGC == 1) { # the pattern was the only thing, so force read from standard input (used by book)
        ARGC = 2
        ARGV[1] = "-"
    }
}
$0 ~ pattern { print FILENAME ":" $0 }

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

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

awk 'prog'

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

Автономные сценарии AWK.

[ редактировать ]

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

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

#!/usr/bin/awk -f
{ print $0 }

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

The -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++; его состояние неизвестно. [16]

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

См. также

[ редактировать ]
  1. ^ Штутц, Майкл (19 сентября 2006 г.). «Начало работы с GAWK: основы языка AWK» (PDF) . РазработчикWorks . ИБМ . Архивировано (PDF) из оригинала 27 апреля 2015 г. Проверено 29 января 2015 г. [AWK] часто называют языком, управляемым данными — операторы программы описывают входные данные, которые необходимо сопоставить и обработать, а не последовательность шагов программы.
  2. ^ Андреас Дж. Пилавакис (1989). UNIX-семинар . Международное высшее образование Макмиллана. п. 196.
  3. ^ Арнольд Роббинс (2015). Эффективное программирование на Awk: универсальная обработка текста и сопоставление с образцом (4-е изд.). О'Рейли Медиа. п. 560.
  4. ^ Jump up to: а б Джеймс В. Ливингстон (2 мая 1988 г.). «Великая программа awk — это не птичий мозг». Цифровой обзор . п. 91.
  5. ^ Рэймонд, Эрик С. «Применение мини-языков» . Искусство программирования для Unix . Практический пример: awk. Архивировано из оригинала 30 июля 2008 года . Проверено 11 мая 2010 г. Язык действий awk является полным по Тьюрингу и может читать и записывать файлы.
  6. ^ Ахо, Альфред В .; Керниган, Брайан В .; Вайнбергер, Питер Дж. (1 сентября 1978 г.). Awk — язык сканирования и обработки шаблонов (второе издание) (технический отчет). Руководство по Unix, седьмое издание, том 2. Bell Telephone Laboratories, Inc. Проверено 1 февраля 2020 г.
  7. ^ Jump up to: а б Ахо, Альфред В.; Керниган, Брайан В.; Вайнбергер, Питер Дж. (1988). Язык программирования AWK . Издательство Аддисон-Уэсли. ISBN  9780201079814 . Проверено 16 мая 2015 г.
  8. ^ «Специальный выпуск UNIX: профессора Керниган и Брейлсфорд» . Компьютерфил . 30 сентября 2015 г. Архивировано из оригинала 22 ноября 2021 г.
  9. ^ «Единая спецификация UNIX, версия 3, таблица интерфейса утилит» . Архивировано из оригинала 05 января 2018 г. Проверено 18 декабря 2005 г.
  10. ^ «Глава 15. Команды и утилиты». Стандартная базовая базовая спецификация Linux 4.0 (технический отчет). Фонд Linux. 2008. Архивировано из оригинала 16 октября 2019 г. Проверено 01 февраля 2020 г.
  11. ^ Путеводитель по Вселенной для инсайдеров (PDF) . Charles River Data Systems, Inc., 1983. с. 13.
  12. ^ Jump up to: а б с Роббинс, Арнольд (март 2014 г.). «Проект GNU и я: 27 лет с GNU AWK» (PDF) . skeeve.com . Архивировано (PDF) из оригинала 6 октября 2014 г. Проверено 4 октября 2014 г.
  13. ^ Догерти, Дейл; Роббинс, Арнольд (1997). sed & awk (2-е изд.). Севастополь, Калифорния: О’Рейли. п. 221. ИСБН  1-565-92225-5 .
  14. ^ Гамильтон, Наоми (30 мая 2008 г.). «А-Я языков программирования: AWK» . Компьютерный мир . Архивировано из оригинала 01 февраля 2020 г. Проверено 12 декабря 2008 г.
  15. ^ Jump up to: а б «Записи (Руководство пользователя GNU Awk)» . Архивировано из оригинала 14 июня 2020 г. Проверено 23 мая 2020 г.
  16. ^ Керниган, Брайан В. (24–25 апреля 1991 г.). Переводчик AWK в C++ (PDF) . Конференция Usenix C++. Вашингтон, округ Колумбия. стр. 217–228. Архивировано (PDF) из оригинала 22 июня 2020 г. Проверено 01 февраля 2020 г.
  17. ^ «Журнал работы FreeBSD для импорта BWK awk в ядро ​​FreeBSD» . 16 мая 2005 года. Архивировано из оригинала 8 сентября 2013 года . Проверено 20 сентября 2006 г.
  18. ^ «Обработка CSV с помощью gawk (с использованием расширения gawk-csv)» . gawkextlib . 2018. Архивировано из оригинала 25 марта 2020 г.
  19. ^ Джеймс К. Лоулесс (1 мая 1997 г.). «Изучение компилятора TAWK» . Журнал доктора Добба . Архивировано из оригинала 21 февраля 2020 года . Проверено 21 февраля 2020 г.
  20. ^ « Челюсть в SourceForge» . Архивировано из оригинала 27 мая 2007 г. Проверено 23 августа 2006 г.
  21. ^ « xgawk Домашняя страница » . Архивировано из оригинала 18 апреля 2013 г. Проверено 7 мая 2013 г.
  22. ^ «QSEAWK на GitHub» . Гитхаб . Архивировано из оригинала 11 июня 2018 г. Проверено 6 сентября 2017 г.
  23. ^ «CLAWK на GitHub» . Гитхаб . Архивировано из оригинала 25 августа 2021 г. Проверено 1 июня 2021 г.

Дальнейшее чтение

[ редактировать ]
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 99efacad1137c679a65db2dc27a09227__1714652280
URL1:https://arc.ask3.ru/arc/aa/99/27/99efacad1137c679a65db2dc27a09227.html
Заголовок, (Title) документа по адресу, URL1:
AWK - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)