Введение

Язык программирования AWK (/ɔː//k/) является стандартной функцией большинства Unix-подобных операционных систем. Язык AWK — это скриптовый язык, основанный на данных, состоящий из набора действий, предназначенных для обработки потоков текстовых данных — либо непосредственно из файлов, либо как часть конвейера — с целью извлечения или преобразования текста, например, для создания форматированных отчётов. Язык широко использует строковый тип данных, ассоциативные массивы (то есть массивы, индексированные строковыми ключами) и регулярные выражения. Несмотря на ограниченную область применения и первоначальную разработку для поддержки однострочных программ, язык является полным по Тьюрингу, и даже ранние пользователи AWK в Bell Labs часто писали хорошо структурированные большие программы на AWK. AWK был создан в Bell Labs в 1970-х годах, и его название образовано от фамилий его авторов: Альфреда Ахо (автора egrep), Питера Вайнбергера (работавшего над небольшими реляционными базами данных) и Брайана Кернигана. Акроним произносится так же, как название вида птиц олуша, который изображён на обложке книги «Язык программирования AWK». Будучи одним из первых инструментов, появившихся в Unix версии 7, AWK добавил вычислительные возможности в конвейер Unix, помимо оболочки Bourne, единственного доступного скриптового языка в стандартной среде Unix. Он является одним из обязательных компонентов спецификации Single UNIX Specification и требуется спецификацией Linux Standard Base. В 1983 году AWK был одним из нескольких инструментов UNIX, доступных для операционной системы UNOS компании Charles River Data Systems по лицензии Bell Laboratories. AWK был значительно переработан и расширен в 1985–1988 годах, что привело к созданию реализации GNU AWK, написанной Полом Рубином, Джеем Фенласоном и Ричардом Столлманом, выпущенной в 1988 году. GNU AWK поддерживается исключительно Арнольдом Роббинсом с 1994 года. Исходный код nawk (New AWK) Брайана Кернигана был впервые выпущен в 1993 году неофициально, а публично — в конце 1990-х годов; многие системы BSD используют его, чтобы избежать лицензии GPL. Программа AWK представляет собой последовательность пар «шаблон-действие», записанных следующим образом:

шаблон { действие }
шаблон { действие }

где шаблон обычно является выражением, а действие — набором команд. Входные данные разделяются на записи, при этом по умолчанию записи разделяются символами новой строки, то есть входные данные разбиваются на строки. Программа последовательно проверяет каждую запись на соответствие каждому из шаблонов и выполняет действие для каждого истинного выражения. Шаблон или действие могут быть опущены. Если шаблон опущен, по умолчанию происходит сопоставление с каждой записью. Действие по умолчанию — вывод записи. Эта структура «шаблон-действие» аналогична структуре sed. Помимо простого выражения AWK, такого как foo == 1 или /^foo/, шаблон может быть BEGIN или END, что приводит к выполнению действия до или после обработки всех записей, или pattern1, pattern2, что соответствует диапазону записей, начиная с записи, соответствующей pattern1, и заканчивая записью, соответствующей pattern2, после чего снова выполняется сопоставление с pattern1 в последующих строках. Помимо обычных арифметических и логических операторов, выражения AWK включают оператор тильды (~), который сопоставляет регулярное выражение со строкой. В качестве удобного синтаксического сахара /regexp/ без использования оператора тильды соответствует текущей записи; этот синтаксис был унаследован от sed, который, в свою очередь, унаследовал его от редактора ed, где символ / используется для поиска. Этот синтаксис использования слешей в качестве разделителей регулярных выражений впоследствии был принят Perl и ECMAScript и стал распространённым. Оператор тильды также был принят Perl.

Команды

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