- СИНТАКСИС
- ВАЖНО: СНАЧАЛА ПРОЧТИТЕ
- ОПИСАНИЕ
- ПРЕДИСЛОВИЕ
- ФОРМАТ ОПЦИЙ
- ОПЦИИ
- ВЫПОЛНЕНИЕ ПРОГРАММЫ AWK
- ПЕРЕМЕННЫЕ, ЗАПИСИ И ПОЛЯ
- ШАБЛОНЫ И ДЕЙСТВИЯ
- ОПРЕДЕЛЯЕМЫЕ ПОЛЬЗОВАТЕЛЕМ ФУНКЦИИ
- ДИНАМИЧЕСКАЯ ЗАГРУЗКА НОВЫХ ФУНКЦИЙ
- СИГНАЛЫ
- ЛОКАЛИЗАЦИЯ
- РАСШИРЕНИЯ GNU
- ПЕРЕМЕННЫЕ ОКРУЖЕНИЯ
- СТАТУС ВЫХОДА
- ИНФОРМАЦИЯ О ВЕРСИИ
- АВТОРЫ
- ОТПРАВКА ОТЧЕТОВ ОБ ОШИБКАХ И ЗАДАЧА ВОПРОСОВ
- ОШИБКИ
- ССЫЛКИ
- ПРИМЕРЫ
- ПРАВА НА КОПИРОВАНИЕ
gawk - язык для сканирования и обработки шаблонов
СИНТАКСИС
gawk [ опции в стиле POSIX или GNU ] -f program-file [ -- ] file ...
gawk [ опции в стиле POSIX или GNU ] [ -- ] program-text file ...
ВАЖНО: СНАЧАЛА ПРОЧТИТЕ
Эта страница руководства предоставляется в качестве справочной информации. Обратите внимание, что основным источником информации о gawk является документ Texinfo, доступный онлайн в различных форматах по адресу https://www.gnu.org/software/gawk/manual. Его также можно установить в подсистеме Info вашей системы и получить доступ к нему с помощью команды info(1).
В случае каких-либо противоречий между документом Texinfo и этой страницей руководства, документ должен считаться авторитетным.
ОПИСАНИЕ
Gawk - это реализация языка программирования AWK проекта GNU. Она соответствует определению языка в стандарте POSIX 1003.1. Эта версия, в свою очередь, основана на описании в книге «Язык программирования AWK» Ахо, Кернигана и Вайнбергера. Gawk предоставляет дополнительные функции, найденные в текущей версии AWK Брайана Кернигана и многочисленные расширения, специфичные для GNU.
Командная строка состоит из опций для gawk, текста программы AWK (если он не предоставляется через опции -f или --include) и значений, которые должны быть доступны в предопределенных переменных AWK ARGC и ARGV.
ПРЕДИСЛОВИЕ
Эта страница руководства намеренно максимально лаконична. Полные сведения приведены в GAWK: Effective AWK Programming, и вам следует обратиться к ней для получения полной информации о любой конкретной функции. По возможности, предоставляются ссылки на онлайн-версию руководства.
ФОРМАТ ОПЦИЙ
Опции Gawk могут быть либо традиционными опциями в стиле POSIX, состоящими из одной буквы, либо опциями GNU в длинном формате. Опции POSIX начинаются с одной «-», а опции в длинном формате - с «--». Опции в длинном формате предоставляются как для функций, специфичных для GNU, так и для функций, предписанных POSIX.
Опции, специфичные для Gawk, обычно используются в длинном формате. Аргументы для опций в длинном формате либо соединяются с опцией знаком «=» без пробелов, либо могут быть предоставлены в следующем аргументе командной строки. Опции в длинном формате могут быть сокращены, если сокращение остается уникальным.
Кроме того, для каждой длинной опции существует соответствующая короткая опция, чтобы функциональность опции могла использоваться в исполняемых скриптах, начинающихся с «#!».
ОПЦИИ
Gawk принимает следующие опции. Сначала перечисляются стандартные опции, затем опции для расширений gawk, перечисленные в алфавитном порядке по короткой опции.
-f program-file, --file program-file
Считывает исходный код программы AWK из файла program-file, а не из первого аргумента командной строки. Можно использовать несколько опций -f. Файлы, читаемые с помощью -f, рассматриваются так, как если бы они начинались с неявного оператора @namespace "awk".
-F fs, --field-separator fs
Используйте fs в качестве разделителя полей ввода (значение предопределенной переменной FS).
-v var=val, --assign var=val
Присвойте значение val переменной var перед началом выполнения программы. Эти значения переменных доступны в правиле BEGIN программы AWK.
-b, --characters-as-bytes
Рассматривайте все входные данные как отдельные байты. Опция --posix имеет приоритет над этой.
-c, --traditional
Запустите в режиме совместимости. В режиме совместимости gawk ведет себя идентично awk Брайана Кернигана; расширения GNU не распознаются.
-C, --copyright
Выведите краткую версию сообщения об авторских правах GNU на стандартный вывод и успешно завершите работу.
-d[file], --dump-variables[=file]
Выведите отсортированный список глобальных переменных, их типы и конечные значения в файл. Файл по умолчанию — awkvars.out в текущем каталоге.
-D[file], --debug[=file]
Включите отладку программ AWK. По умолчанию отладчик считывает команды интерактивно с клавиатуры (стандартный ввод). Необязательный аргумент файла указывает файл со списком команд, которые отладчик должен выполнить в неинтерактивном режиме.
В этом режиме выполнения gawk загружает исходный код программы AWK, а затем запрашивает команды отладки. Gawk может отлаживать только исходный код программы AWK, предоставленный с помощью опций -f и --include. Отладчик документирован в GAWK: Effective AWK Programming; см. https://www.gnu.org/software/gawk/manual/html_node/Debugger.html#Debugger.
-e program-text, --source program-text
Используйте program-text в качестве исходного кода программы AWK. Каждый аргумент, передаваемый через -e, рассматривается так, как будто он начинается с неявного оператора @namespace "awk".
-E file, --exec file
Аналогично -f, однако эта опция обрабатывается последней. Ее следует использовать со сценариями, начинающимися с `#!`, особенно для приложений CGI, чтобы избежать передачи опций или исходного кода в командной строке из URL. Эта опция отключает присвоение переменных в командной строке.
-g, --gen-pot
Просканируйте и проанализируйте программу AWK и сгенерируйте файл в формате GNU .pot (Portable Object Template) на стандартный вывод с записями для всех локализуемых строк в программе. Сама программа не выполняется.
-h, --help
Выведите краткое описание доступных опций на стандартный вывод. В соответствии с GNU Coding Standards эти опции приводят к немедленному, успешному завершению работы.
-i include-file, --include include-file
Загрузите библиотеку исходного кода awk. Это выполняет поиск библиотеки с помощью переменной среды AWKPATH. Если первоначальный поиск не удался, будет предпринята еще одна попытка после добавления суффикса .awk. Файл будет загружен только один раз (т. е. дубликаты удаляются), и код не является основным исходным кодом программы. Файлы, читаемые с помощью --include, рассматриваются так, как будто они начинаются с неявного оператора @namespace "awk".
-I, --trace
Выводит внутренние имена байт-кода по мере их выполнения при запуске программы. Трассировка выводится в стандартный поток ошибок. Каждый «код операции» в выводе предваряется знаком «+».
-k, --csv
Включает специальную обработку CSV. Подробности см. в разделе «Comma Separated Values» ниже.
-l lib, --load lib
Загружает расширение gawk из общей библиотеки lib. Для поиска библиотеки используется переменная среды AWKLIBPATH. Если начальный поиск не удался, делается еще одна попытка после добавления стандартного суффикса общей библиотеки для платформы. Ожидается, что процедура инициализации библиотеки будет называться dl_load().
-L [value], --lint[=value]
Предоставляет предупреждения о конструкциях, которые являются сомнительными или не переносимыми в другие реализации AWK. Список возможных значений для value см. в https://www.gnu.org/software/gawk/manual/html\_node/Options.html\#Options.
-M, --bignum
Принудительно использует арифметику произвольной точности для чисел. Эта опция не имеет никакого эффекта, если gawk не скомпилирована с использованием библиотек GNU MPFR и GMP. (В этом случае gawk выдает предупреждение.)
ПРИМЕЧАНИЕ: эта функция находится в стадии эксперимента. Основной разработчик gawk больше не поддерживает ее, хотя в команде разработчиков есть участник, который ее поддерживает. Если эта ситуация изменится, функция будет удалена из gawk.
-n, --non-decimal-data
Распознает восьмеричные и шестнадцатеричные значения во входных данных. Используйте эту опцию с большой осторожностью!
-N, --use-lc-numeric
Принуждает gawk использовать десятичный разделитель текущей локали при анализе входных данных.
-o[file], --pretty-print[=file]
Выводит отформатированную версию программы в файл. Файл по умолчанию — awkprof.out в текущем каталоге. Эта опция подразумевает --no-optimize.
-O, --optimize
Включает оптимизации gawk по умолчанию для внутреннего представления программы. Эта опция включена по умолчанию.
-p[prof-file], --profile[=prof-file]
Запускает сеанс профилирования и отправляет данные профилирования в файл prof-file. По умолчанию файл — awkprof.out в текущем каталоге. Профиль содержит количество выполнений каждого оператора в программе в левой части и количество вызовов каждой пользовательской функции. Gawk работает медленнее в этом режиме. Эта опция подразумевает --no-optimize.
-P, --posix
Включает режим совместимости и отключает ряд распространенных расширений.
-r, --re-interval
Включает использование интервальных выражений в сопоставлении с регулярными выражениями. Интервальные выражения включены по умолчанию, но эта опция остается для обратной совместимости.
-s, --no-optimize
Отключает оптимизации gawk по умолчанию для внутреннего представления программы.
-S, --sandbox
Запускает gawk в режиме «песочницы», отключая функцию system(), перенаправление ввода с помощью getline, перенаправление вывода с помощью print и printf, а также загрузку динамических расширений. Выполнение команд (через конвейеры) также отключено.
-t, --lint-old
Выводит предупреждения об конструкциях, которые не переносимы в оригинальную версию UNIX awk.
-V, --version
Выводит информацию о версии данной копии gawk в стандартный вывод. Это полезно при сообщении об ошибках. В соответствии со стандартами кодирования GNU, эти опции приводят к немедленному успешному завершению работы.
-- Разделитель, сигнализирующий об окончании опций. Это полезно для передачи последующих аргументов программе AWK, которые начинаются с «-».
В режиме совместимости любые другие опции помечаются как недопустимые, но в противном случае игнорируются. В обычном режиме, если предоставлен текст программы, неизвестные опции передаются программе AWK в массиве ARGV для обработки.
Для обеспечения совместимости с POSIX можно использовать опцию -W, за которой следует имя длинной опции.
ВЫПОЛНЕНИЕ ПРОГРАММЫ AWK
Программа AWK состоит из последовательности необязательных директив, операторов «шаблон-действие» и необязательных определений функций.
@include "имя_файла"
@load "имя_файла"
@namespace "имя"
шаблон { операторы действия }
function имя(список параметров) { операторы }
Gawk сначала считывает исходный код программы из файлов программы, указанных в параметре --source, или из первого непараметрического аргумента в командной строке. Опции -f и --source можно использовать несколько раз в командной строке. Gawk считывает текст программы так, как если бы все файлы программы и текст, переданные через командную строку, были объединены вместе.
Кроме того, строки, начинающиеся с @include, можно использовать для включения других исходных файлов в вашу программу. Это эквивалентно использованию опции --include.
Строки, начинающиеся с @load, можно использовать для загрузки расширенных функций в вашу программу. Это эквивалентно использованию опции --load.
Переменная среды AWKPATH указывает путь поиска, который используется при поиске исходных файлов, указанных в опциях -f и --include. Если эта переменная не существует, путь по умолчанию — «./:/usr/local/share/awk». (Фактический каталог может отличаться в зависимости от того, как был создан и установлен gawk.) Если имя файла, переданное в опцию -f, содержит символ «/», поиск по пути не выполняется.
Переменная среды AWKLIBPATH указывает путь поиска, который используется при поиске исходных файлов, указанных в опции --load. Если эта переменная не существует, путь по умолчанию — «/usr/local/lib/gawk». (Фактический каталог может отличаться в зависимости от того, как был создан и установлен gawk.)
Gawk выполняет программы AWK в следующем порядке. Сначала выполняются все назначения переменных, указанные в опции -v. Затем gawk компилирует программу во внутреннюю форму. Затем gawk выполняет код в правилах BEGIN (если таковые имеются), а затем переходит к чтению каждого файла, указанного в массиве ARGV (до ARGV[ARGC-1]). Если в командной строке не указаны файлы, gawk считывает стандартный ввод.
Если имя файла в командной строке имеет форму var=val, оно рассматривается как назначение переменной. Переменной var будет присвоено значение val. (Это происходит после выполнения любых правил BEGIN.)
Если значение определенного элемента ARGV пусто (""), gawk пропускает его.
Для каждого входного файла, если существует правило BEGINFILE, gawk выполняет связанный с ним код перед обработкой содержимого файла. Аналогично, gawk выполняет код, связанный с правилами ENDFILE, после обработки файла.
Для каждой записи во входном потоке gawk проверяет, соответствует ли она каким-либо шаблонам в программе AWK. Для каждого шаблона, которому соответствует запись, gawk выполняет связанное с ним действие. Шаблоны проверяются в порядке их появления в программе.
Наконец, после исчерпания всех входных данных, gawk выполняет код в правилах END (если таковые имеются).
Параметры командной строки
Согласно POSIX, файлы, указанные в команде awk, должны быть текстовыми. Поведение не определено, если это не так. В большинстве версий awk указание каталога в командной строке приводит к фатальной ошибке.
Для gawk указание каталога в командной строке приводит к предупреждению, но в остальном пропускается. Если указаны один из параметров --posix или --traditional, gawk возвращается к обработке каталогов в командной строке как фатальной ошибки.
ПЕРЕМЕННЫЕ, ЗАПИСИ И ПОЛЯ
Переменные AWK являются динамическими; они создаются при первом использовании. Их значения либо числа с плавающей запятой, либо строки, либо и то, и другое, в зависимости от того, как они используются. Кроме того, gawk позволяет переменным иметь тип регулярного выражения. AWK также имеет одномерные массивы; многомерные массивы могут быть смоделированы. Однако gawk предоставляет настоящие массивы массивов. Несколько предопределенных переменных устанавливаются во время выполнения программы; они описываются по мере необходимости и суммируются ниже.
Записи
Обычно записи разделяются символами новой строки. Вы можете контролировать, как разделяются записи, присваивая значения встроенной переменной RS. Подробности см. в [https://www.gnu.org/software/gawk/manual/html_node/Records.html].
Поля
При чтении каждой входной записи gawk разбивает запись на поля, используя значение переменной FS в качестве разделителя полей. Кроме того, FIELDWIDTHS и FPAT могут использоваться для управления разделением входных полей. Подробности см. в [https://www.gnu.org/software/gawk/manual/html_node/Fields.html].
Каждое поле во входной записи можно получить по его позиции: $1, $2 и так далее. $0 — это вся запись, включая начальные и конечные пробелы.
Переменная NF устанавливается в общее количество полей во входной записи.
Обращения к несуществующим полям (то есть полям после $NF) приводят к возврату пустой строки. Однако присвоение значения несуществующему полю (например, $(NF+2) = 5) увеличивает значение NF, создает все промежуточные поля со значением пустой строки и приводит к перевычислению значения $0, при этом поля разделяются значением OFS. Обращения к полям с отрицательным номером вызывают фатальную ошибку. Уменьшение значения NF приводит к потере значений полей после нового значения, и значение $0 перевычисляется, при этом поля разделяются значением OFS.
Присвоение значения существующему полю приводит к перестройке всей записи при обращении к $0. Аналогично, присвоение значения $0 приводит к повторному разделению записи, создавая новые значения для полей.
Разделенные запятыми значения
При использовании опций -k или --csv gawk не использует стандартное определение записи и разделение полей, как описано выше. Вместо этого записи завершаются неэкранированными символами новой строки, а поля разделяются запятыми. Двойные кавычки можно использовать для заключения полей, содержащих запятые, символы новой строки или удвоенные двойные кавычки. Подробности см. в разделе [https://www.gnu.org/software/gawk/manual/html_node/Comma-Separated-Fields.html].
Встроенные переменные
Список встроенных переменных gawk приведен ниже. Этот список намеренно лаконичен. Подробности см. в разделе [https://www.gnu.org/software/gawk/manual/html_node/Built_002din-Variables.html].
ARGC Количество аргументов командной строки.
ARGIND Индекс в ARGV текущего обрабатываемого файла.
ARGV Массив аргументов командной строки. Массив индексируется от 0 до ARGC - 1.
BINMODE В не-POSIX системах указывает использование "двоичного" режима для всех операций ввода-вывода файлов. Подробности см. в разделе [https://www.gnu.org/software/gawk/manual/html_node/PC-Using.html](https://www.gnu.org/software/gawk/manual/html_node/PC-Using.html).
CONVFMT Формат преобразования чисел, по умолчанию "%.6g".
ENVIRON Массив, содержащий значения текущей среды. Массив индексируется по именам переменных среды, каждый элемент представляет собой значение этой переменной.
ERRNO Если во время перенаправления для getline, во время чтения для getline или во время закрытия возникает системная ошибка, ERRNO устанавливается в строку, описывающую ошибку. Значение может быть изменено в неанглийских локалях.
FIELDWIDTHS Разделенный пробелами список ширины полей. При установке gawk анализирует входные данные на поля фиксированной ширины, вместо использования значения переменной FS в качестве разделителя полей. Каждая ширина поля может быть опционально предварена значением, разделенным двоеточием, указывающим количество символов, которые следует пропустить перед началом поля.
FILENAME Имя текущего входного файла. Если файлы не указаны в командной строке, значение FILENAME равно "-". Однако FILENAME не определена внутри правила BEGIN (если только не задана с помощью getline).
FNR Номер записи во входном файле.
FPAT Регулярное выражение, описывающее содержимое полей в записи. При установке gawk анализирует входные данные на поля, где поля соответствуют регулярному выражению, вместо использования значения FS в качестве разделителя полей.
FS Разделитель входных полей, по умолчанию - пробел. Подробности см. в разделе [https://www.gnu.org/software/gawk/manual/html\_node/Field-Separators.html](https://www.gnu.org/software/gawk/manual/html_node/Field-Separators.html).
FUNCTAB Массив, индексы и соответствующие значения которого представляют собой имена всех пользовательских или расширенных функций в программе. ПРИМЕЧАНИЕ: вы не можете использовать оператор delete с массивом FUNCTAB.
IGNORECASE Управляет чувствительностью к регистру всех операций с регулярными выражениями и строками. См. https://www.gnu.org/software/gawk/manual/html_node/Case_002dsensitivity.html для получения подробной информации.
LINT Обеспечивает динамическое управление опцией --lint изнутри программы AWK.
NF Количество полей в текущей входной записи.
NR Общее количество входных записей, обработанных до настоящего момента.
OFMT Формат вывода чисел, по умолчанию "%.6g".
OFS Разделитель полей вывода, по умолчанию пробел.
ORS Разделитель записей вывода, по умолчанию символ новой строки.
PREC Рабочая точность чисел с произвольной точностью, по умолчанию 53.
PROCINFO Элементы этого массива обеспечивают доступ к информации о запущенной программе AWK. См. https://www.gnu.org/software/gawk/manual/html_node/Auto_002dset для получения подробной информации.
ROUNDMODE Режим округления, используемый для арифметики чисел с произвольной точностью, по умолчанию "N" (режим IEEE-754 roundTiesToEven). См. https://www.gnu.org/software/gawk/manual/html_node/Setting-the-rounding-mode для получения подробной информации.
RS Разделитель входных записей, по умолчанию символ новой строки.
RT Терминатор записи. Gawk устанавливает RT в текст ввода, который соответствует символу или регулярному выражению, указанному в RS.
RSTART Индекс первого символа, соответствующего результату выполнения функции match(); 0, если соответствий не найдено.
RLENGTH Длина строки, соответствующей результату выполнения функции match(); -1, если соответствий не найдено.
SUBSEP Строка, используемая для разделения нескольких индексов в элементах массива, по умолчанию "\034".
SYMTAB Массив, индексы которого представляют собой имена всех в настоящее время определенных глобальных переменных и массивов в программе. Вы не можете использовать оператор delete с массивом SYMTAB, а также присваивать значения элементам, индекс которых не является именем переменной.
TEXTDOMAIN Область локализации программы AWK; используется для поиска локализованных переводов строк программы.
Массивы
Массивы индексируются выражением, заключенным в квадратные скобки ([ и ]). Если выражение является списком выражений (expr, expr ...), то индекс массива представляет собой строку, состоящую из конкатенации (строкового) значения каждого выражения, разделенного значением переменной SUBSEP. Эта функция используется для имитации многомерных массивов. Например:
i = "A"; j = "B"; k = "C"
x[i, j, k] = "hello, world\n"
Присваивает строку "hello, world\n" элементу массива x, который индексируется строкой "A\034B\034C". Все массивы в AWK являются ассоциативными, то есть индексируются строковыми значениями.
Специальный оператор in может использоваться для проверки, содержит ли массив индекс, состоящий из определенного значения:
if (val in array)
print array[val]
Если массив имеет несколько индексов, используйте (i, j) в array.
Конструкция in также может использоваться в цикле for для перебора всех элементов массива.
Однако, конструкция (i, j) in array работает только в тестах, а не в циклах for.
Элемент можно удалить из массива с помощью оператора delete. Оператор delete также можно использовать для удаления всего содержимого массива, просто указав имя массива без индекса.
gawk поддерживает настоящие многомерные массивы. Не требуется, чтобы такие массивы были «прямоугольными», как в C или C++. См. [https://www.gnu.org/software/gawk/manual/html_node/Arrays] для получения подробной информации.
Пространства имен
Gawk предоставляет простое средство для работы с пространствами имен, чтобы обойти тот факт, что все переменные в AWK являются глобальными.
Квалифицированное имя состоит из двух простых идентификаторов, соединенных двойным двоеточием (::). Левый идентификатор представляет пространство имен, а правый идентификатор — переменную в этом пространстве имен. Все простые (неквалифицированные) имена считаются находящимися в «текущем» пространстве имен; пространство имен по умолчанию — awk. Однако простые идентификаторы, состоящие только из заглавных букв, принудительно помещаются в пространство имен awk, даже если текущее пространство имен отличается.
Вы можете изменить текущее пространство имен с помощью директивы @namespace "name".
Стандартные предопределенные имена встроенных функций не могут использоваться в качестве имен пространств имен. Имена дополнительных функций, предоставляемых gawk, могут использоваться в качестве имен пространств имен или в качестве простых идентификаторов в других пространствах имен. Для получения дополнительной информации см. [https://www.gnu.org/software/gawk/manual/html_node/Namespaces.html#Namespaces].
Типизация переменных и преобразование типов
Переменные и поля могут быть числами (с плавающей точкой), строками или и тем, и другим. Они также могут быть регулярными выражениями. То, как интерпретируется значение переменной, зависит от контекста. Если она используется в числовом выражении, она будет рассматриваться как число; если она используется в качестве строки, она будет рассматриваться как строка.
Чтобы принудительно рассматривать переменную как число, добавьте к ней ноль; чтобы принудительно рассматривать ее как строку, объедините ее с пустой строкой.
Неинициализированные переменные имеют числовое значение, равное нулю, и строковое значение, равное "" (пустая строка).
Когда строку необходимо преобразовать в число, преобразование выполняется с помощью strtod(3). Число преобразуется в строку путем использования значения CONVFMT в качестве строки формата для sprintf(3), при этом числовое значение переменной используется в качестве аргумента. Однако, хотя все числа в AWK являются числами с плавающей точкой, целочисленные значения всегда преобразуются в целые числа.
Gawk выполняет сравнения следующим образом: если две переменные являются числовыми, они сравниваются численно. Если одно значение является числовым, а другое — строковым, которое является «числовой строкой», то сравнения также выполняются численно. В противном случае числовое значение преобразуется в строку и выполняется строковое сравнение. Две строки, конечно, сравниваются как строки.
Обратите внимание, что строковые константы, такие как "57", не являются числовыми строками, это просто строковые константы.
Идея «числовой строки» применима только к полям, входным данным, полученным с помощью getline, FILENAME, элементам ARGV, элементам ENVIRON и элементам массива, созданного с помощью split() или patsplit(), которые являются числовыми строками. Основная идея заключается в том, что пользовательский ввод, и только пользовательский ввод, который выглядит как число, должен обрабатываться как число.
Восьмеричные и шестнадцатеричные константы
Вы можете использовать восьмеричные и шестнадцатеричные константы в стиле C в исходном коде вашей программы AWK. Например, восьмеричное значение 011 равно десятичному 9, а шестнадцатеричное значение 0x11 равно десятичному 17.
Строковые константы
Строковые константы в AWK — это последовательности символов, заключенные в двойные кавычки (например, "value"). Внутри строк распознаются определенные управляющие последовательности, как и в C. Подробности см. в [https://www.gnu.org/software/gawk/manual/html_node/Escape-Sequences].
Константы регулярных выражений
Константа регулярного выражения — это последовательность символов, заключенная в прямые скобки (например, /value/).
Управляющие последовательности, описанные в руководстве, также могут использоваться внутри констант регулярных выражений (например, /[ \t\f\n\r\v]/ соответствует символам пробела).
Gawk предоставляет строго типизированные константы регулярных выражений. Они записываются с помощью ведущего символа @ (например, @/value/). Такие константы могут быть присвоены скалярным переменным (переменным, элементам массива) и переданы пользовательским функциям. Переменные, которым присвоены такие значения, имеют тип регулярного выражения.
ШАБЛОНЫ И ДЕЙСТВИЯ
AWK — это язык, ориентированный на строки. Сначала идет шаблон, затем действие. Операторы действий заключаются в { и }. Либо шаблон, либо действие могут отсутствовать, но, конечно, не оба. Если шаблон отсутствует, действие выполняется для каждой записи входных данных. Отсутствующее действие эквивалентно
{ print }
что выводит всю запись.
Комментарии начинаются с символа # и продолжаются до конца строки. Пустые строки могут использоваться для разделения операторов. Обычно оператор заканчивается новой строкой, однако это не так для строк, заканчивающихся запятой, {, ?, :, && или ||. Строки, заканчивающиеся на do или else, также автоматически продолжаются на следующей строке. В других случаях строку можно продолжить, добавив в конце символ "\", в этом случае символ новой строки игнорируется. Однако символ "\" после # не имеет специального значения.
Несколько операторов могут быть помещены в одну строку, разделяя их символом ";". Это относится как к операторам внутри части действия пары шаблон-действие (обычный случай), так и к самим операторам шаблон-действие.
Шаблоны
Шаблоны AWK могут быть одним из следующих:
BEGIN
END
BEGINFILE
ENDFILE
/регулярное выражение/
реляционное выражение
шаблон && шаблон
шаблон || шаблон
шаблон ? шаблон : шаблон
(шаблон)
! шаблон
шаблон1, шаблон2
BEGIN и END — это два специальных типа шаблонов, которые не проверяются на соответствие входным данным. Части действий всех шаблонов BEGIN объединяются так, как если бы все операторы были написаны в одном правиле BEGIN. Они выполняются до того, как будут прочитаны какие-либо входные данные. Аналогично, все правила END объединяются и выполняются после того, как все входные данные будут обработаны (или после выполнения оператора exit). Шаблоны BEGIN и END нельзя объединять с другими шаблонами в выражениях шаблонов. Шаблоны BEGIN и END не могут содержать отсутствующие части действий.
BEGINFILE и ENDFILE — это дополнительные специальные шаблоны, действия которых выполняются перед чтением первой записи каждого входного файла, указанного в командной строке, и после чтения последней записи каждого файла. Внутри правила BEGINFILE значение переменной ERRNO — это пустая строка, если файл был успешно открыт. В противном случае возникла проблема с файлом, и код должен использовать nextfile, чтобы пропустить его. Если этого не сделать, gawk выдаст обычную фатальную ошибку для файлов, которые не могут быть открыты.
Для шаблонов /регулярное выражение/ связанный оператор выполняется для каждой записи входных данных, соответствующей регулярному выражению. Регулярные выражения по существу такие же, как в egrep(1). Подробную информацию о регулярных выражениях можно найти здесь: https://www.gnu.org/software/gawk/manual/html_node/Regexp.html.
Реляционное выражение может использовать любой из операторов, определенных ниже, в разделе «Действия». Они обычно проверяют, соответствуют ли определенные поля определенным регулярным выражениям.
Операторы &&, || и ! — это логические операторы И, ИЛИ и НЕ соответственно, как в языке C. Они выполняют укороченную оценку, также как в языке C, и используются для объединения более простых выражений шаблонов. Как и в большинстве языков, скобки можно использовать для изменения порядка вычислений.
Оператор ?: аналогичен этому оператору в языке C. Если первое выражение истинно, то для тестирования используется второе выражение, в противном случае — третье. Оценивается только одно из второго и третьего выражений.
Форма выражения pattern1, pattern2 называется диапазоном шаблонов. Он соответствует всем входным записям, начиная с записи, соответствующей pattern1, и продолжая до записи, соответствующей pattern2, включительно. Он не может быть объединен ни с каким другим типом выражений шаблонов.
Действия
Операторы действий заключаются в фигурные скобки { и }. Операторы действий состоят из обычных операторов присваивания, условных операторов и операторов циклов, которые можно найти в большинстве языков. Операторы, управляющие операторы и операторы ввода-вывода, используемые в AWK, основаны на операторах языка C.
Операторы
Операторы в AWK, в порядке убывания приоритета, следующие:
(...) Группировка
$ Ссылка на поле.
++ -- Инкремент и декремент, как префиксные, так и постфиксные.
^ Возведение в степень.
+ - ! Унарный плюс, унарный минус и логическое отрицание.
* / % Умножение, деление и взятие остатка.
+ - Сложение и вычитание.
space Конкатенация строк.
| |& Передача данных по каналам для функций `getline`, `print` и `printf`.
< > <= >= == !=
Стандартные операторы сравнения.
~ !~ Сопоставление с регулярным выражением, отрицательное сопоставление.
in Принадлежность массива.
&& Логическое И.
|| Логическое ИЛИ.
?: Условное выражение C. Имеет вид `expr1 ? expr2 : expr3`. Если `expr1` истинно, значение выражения равно `expr2`, в противном случае — `expr3`. Оценивается только одно из `expr2` и `expr3`.
= += -= *= /= %= ^=
Присваивание. Поддерживаются как абсолютное присваивание (`var = value`), так и операторное присваивание (остальные формы).
Операторы управления
Операторы управления следующие:
if (condition) statement [ else statement ]
while (condition) statement
do statement while (condition)
for (expr1; expr2; expr3) statement
for (var in array) statement
break
continue
delete array[index]
delete array
exit [ expression ]
{ statements }
switch (expression) {
case value|regex : statement
...
[ default: statement ]
}
Операторы ввода-вывода
Операторы ввода-вывода следующие:
close(file [, how]) Закрыть открытый файл, канал или сопроцесс. Необязательный параметр `how` следует использовать только при закрытии одной из сторон двустороннего канала к сопроцессу. Он должен быть строковым значением, либо "to", либо "from".
getline Установить `$0` из следующей записи ввода; установить `NF`, `NR`, `FNR`, `RT`.
getline <file Установить `$0` из следующей записи файла; установить `NF`, `RT`.
getline var Установить `var` из следующей записи ввода; установить `NR`, `FNR`, `RT`.
getline var <file Установить `var` из следующей записи файла; установить `RT`.
command | getline [var]
Запустить `command`, передавая вывод либо в `$0`, либо в `var`, как указано выше, и в `RT`.
command |& getline [var]
Запустить `command` в качестве сопроцесса, передавая вывод либо в `$0`, либо в `var`, как указано выше, и в `RT`. (Команда также может быть сокетом. См. подраздел «Специальные имена файлов» ниже).
fflush([file]) Очистить любые буферы, связанные с открытым выходным файлом или каналом. Если `file` отсутствует или является пустой строкой, очистить все открытые выходные файлы и каналы.
next Прекратить обработку текущей записи ввода. Прочитать следующую запись ввода и начать обработку с первого шаблона в программе AWK. При достижении конца входных данных выполнить любые правила `END`.
nextfile Прекратить обработку текущего входного файла. Следующая читаемая запись ввода поступает из следующего входного файла. Обновить `FILENAME` и `ARGIND`, сбросить `FNR` в 1 и начать обработку с первого шаблона в программе AWK. При достижении конца входных данных выполнить любые правила `ENDFILE` и `END`.
print Вывести текущую запись. Выходная запись завершается значением `ORS`.
print expr-list Вывести выражения. Каждое выражение разделяется значением `OFS`. Выходная запись завершается значением `ORS`.
print expr-list >file Выводит выражения в файл. Каждое выражение разделяется значением переменной OFS. Вывод завершается значением переменной ORS.
printf fmt, expr-list Форматирует и выводит.
printf fmt, expr-list >file
Форматирует и выводит в файл.
system(cmd-line) Выполняет команду cmd-line и возвращает код завершения. (Эта функция может быть недоступна в не-POSIX-системах.) См. https://www.gnu.org/software/gawk/manual/html_node/I_002fO-Functions.html#I_002fO-Functions для получения полной информации о коде завершения.
Дополнительные перенаправления вывода разрешены для команд print и printf.
print ... >> file
Добавляет вывод в файл.
print ... | command
Выводит в канал.
print ... |& command
Отправляет данные в сопроцесс или сокет. (См. также подраздел "Специальные имена файлов" ниже.)
Функция getline возвращает 1 в случае успеха, 0 в случае достижения конца файла и -1 в случае ошибки. Если значение errno(3) указывает, что операцию ввода-вывода можно повторить, и переменная PROCINFO["input", "RETRY"] установлена, то вместо -1 возвращается -2, и последующие вызовы getline могут быть предприняты. В случае ошибки переменная ERRNO устанавливается в строку, описывающую проблему.
ПРИМЕЧАНИЕ: Сбой при открытии двунаправленного сокета приводит к возврату некритической ошибки в вызывающую функцию. При использовании канала, сопроцесса или сокета с getline, или при использовании print или printf в цикле, необходимо использовать close(), чтобы создать новые экземпляры команды или сокета. AWK не закрывает автоматически каналы, сокеты или сопроцессы при достижении ими конца файла (EOF).
Версии printf в AWK и функция sprintf() аналогичны версиям в C. Для получения подробной информации см. https://www.gnu.org/software/gawk/manual/html_node/Printf.html.
Специальные имена файлов
При выполнении операций ввода-вывода с использованием print или printf для записи в файл или при использовании getline для чтения из файла, gawk распознает определенные специальные имена файлов. Эти имена файлов позволяют получить доступ к открытым дескрипторам файлов, унаследованным от родительского процесса gawk (обычно оболочки). Эти имена файлов также можно использовать в командной строке для указания имен файлов данных.
- Стандартный ввод.
/dev/stdin Стандартный ввод.
/dev/stdout Стандартный вывод.
/dev/stderr Стандартный поток ошибок.
/dev/fd/n Файл, связанный с открытым дескриптором файла n.
Следующие специальные имена файлов можно использовать с оператором |& для создания TCP/IP-сетевых подключений:
/inet/tcp/lport/rhost/rport
/inet4/tcp/lport/rhost/rport
/inet6/tcp/lport/rhost/rport
Файлы для TCP/IP-соединения на локальном порту lport с удаленным хостом rhost на удаленном порту rport. Используйте порт 0, чтобы система выбрала порт. Используйте /inet4, чтобы принудительно использовать IPv4-соединение, и /inet6, чтобы принудительно использовать IPv6-соединение. Просто /inet использует значение по умолчанию в системе (вероятно, IPv4). Может использоваться только с оператором двунаправленного ввода-вывода |&.
/inet/udp/lport/rhost/rport
/inet4/udp/lport/rhost/rport
/inet6/udp/lport/rhost/rport
Аналогично, но используется UDP/IP вместо TCP/IP.
Числовые функции
AWK имеет следующие встроенные арифметические функции:
atan2(y, x) Возвращает арктангенс y/x в радианах.
cos(expr) Возвращает косинус expr, который задается в радианах.
exp(expr) Экспоненциальная функция.
int(expr) Обрезает до целого числа.
log(expr) Натуральный логарифм.
rand() Возвращает случайное число N, между нулем и единицей, такое что 0 ≤ N < 1.
sin(expr) Возвращает синус expr, который задается в радианах.
sqrt(expr) Возвращает квадратный корень из expr.
srand([expr]) Использует expr в качестве нового зерна для генератора случайных чисел. Если expr не указан,
используется текущее время. Возвращает предыдущее зерно для генератора случайных чисел.
Строковые функции
Gawk имеет следующие встроенные строковые функции; подробная информация представлена по адресу https://www.gnu.org/software/gawk/manual/html_node/String-Functions.
asort(s [, d [, how] ]) Возвращает количество элементов в исходном массиве s. Сортирует содержимое
s, используя стандартные правила gawk для сравнения значений, и заменяет индексы отсортированных значений s последовательными целыми числами, начиная с 1.
Если указан необязательный целевой массив d, сначала дублирует s в d, а затем сортирует d, не изменяя индексы исходного массива s.
Необязательная строка how управляет направлением и режимом сравнения.
Допустимые значения для how описаны по адресу https://www.gnu.org/software/gawk/manual/html_node/String-Functions.html#String-Functions. s и d могут быть одним и тем же массивом; это имеет смысл только при указании третьего аргумента.
asorti(s [, d [, how] ])
Возвращает количество элементов в исходном массиве s. Поведение аналогично asort(), за исключением того, что для сортировки используются индексы массива, а не значения массива. После выполнения массив индексируется численно,
а значения соответствуют исходным индексам. Исходные значения теряются; поэтому, если вы хотите сохранить исходные значения, укажите второй массив. Назначение необязательной строки how такое же, как и для asort().
Здесь также s и d могут быть одним и тем же массивом; это имеет смысл только при указании третьего аргумента.
gensub(r, s, h [, t]) Ищет в целевой строке t совпадения с регулярным выражением r. Если h — строка, начинающаяся с g или G, то все совпадения r заменяются на s.
В противном случае h — это число, указывающее, какое совпадение r нужно заменить. Если t не указан, используется $0. В заменяющем тексте s последовательность \n, где n — цифра от 1 до 9, может использоваться для указания текста, соответствующего n-й заключенной в скобки подвыражению. Последовательность \0 представляет весь соответствующий текст, как и символ &. В отличие от sub() и gsub(), измененная строка возвращается в качестве результата функции, а исходная целевая строка не изменяется.
gsub(r, s [, t]) Для каждой подстроки, соответствующей регулярному выражению r в строке t,
заменить ее на строку s и вернуть количество замен. Если t не указана, используется $0. Символ & в тексте замены заменяется на фактически найденный текст. Чтобы получить литеральный символ &, используйте \&. (Подробности о правилах для амперсандов и обратных слешей в тексте замены функций sub(), gsub() и gensub() см. в https://www.gnu.org/software/gawk/manual/html_node/Gory-Details.html#Gory-Details).
index(s, t) Вернуть индекс строки t в строке s или ноль, если t отсутствует. (Это подразумевает, что нумерация символов начинается с единицы).
length([s]) Вернуть длину строки s или длину $0, если s не указана. При аргументе в виде массива, length() возвращает количество элементов в массиве.
match(s, r [, a]) Вернуть позицию в s, где встречается регулярное выражение r, или ноль, если r отсутствует, и установить значения RSTART и RLENGTH. Обратите внимание, что порядок аргументов такой же, как и для оператора ~: str ~ re. Подробное описание того, как заполняется массив a, если он предоставлен, см. в https://www.gnu.org/software/gawk/manual/html_node/String-Functions.html#String-Functions.
patsplit(s, a [, r [, seps] ])
Разделить строку s на массив a и массив разделителей seps, используя регулярное выражение r, и вернуть количество полей. Значениями элементов являются части s, соответствующие r. Значение seps[i] — это, возможно, пустой разделитель, который появляется после a[i]. Значение seps[0] — это, возможно, пустой ведущий разделитель. Если r опущен, используется FPAT. Массивы a и seps сначала очищаются. Разделение ведет себя идентично разделению полей с FPAT.
split(s, a [, r [, seps] ])
Разделить строку s на массив a и массив разделителей seps, используя регулярное выражение r, и вернуть количество полей. Если r опущен, используется FS. Массивы a и seps сначала очищаются. seps[i] — это разделитель полей, соответствующий r, между a[i] и a[i+1]. Разделение ведет себя идентично разделению полей.
sprintf(fmt, expr-list) Отформатировать expr-list согласно fmt и вернуть полученную строку.
strtonum(str) Проанализировать str и вернуть его числовое значение. Если str начинается с ведущего 0, рассматривать ее как восьмеричное число. Если str начинается с ведущего 0x или 0X, рассматривать ее как шестнадцатеричное число. В противном случае считать, что это десятичное число.
sub(r, s [, t]) Как и gsub(), но заменяет только первую найденную подстроку. Вернуть либо ноль, либо единицу.
substr(s, i [, n]) Вернуть подстроку s, начинающуюся с i, длиной не более n символов. Если n опущен, использовать оставшуюся часть s.
tolower(str) Вернуть копию строки str, в которой все символы верхнего регистра в str заменены на соответствующие символы нижнего регистра. Неалфавитные символы остаются без изменений.
toupper(str) Вернуть копию строки str, в которой все символы нижнего регистра в str заменены на соответствующие символы верхнего регистра. Неалфавитные символы остаются без изменений.
Gawk поддерживает многобайтовую кодировку. Это означает, что функции index(), length(), substr() и match() работают с символами, а не с байтами.
Функции для работы со временем
Gawk предоставляет следующие функции для получения временных меток и форматирования их. Подробная информация приведена в [https://www.gnu.org/software/gawk/manual/html_node/Time-Functions.]
mktime(datespec [, utc-flag])
Преобразует datespec во временную метку того же формата, что и возвращает systime(), и возвращает результат. Если utc-flag присутствует и имеет ненулевое или непустое значение, время считается находящимся в часовом поясе UTC; в противном случае время считается находящимся в локальном часовом поясе. Если datespec не содержит достаточного количества элементов или если полученное время выходит за допустимые пределы, mktime() возвращает -1. Подробности о datespec см. в [https://www.gnu.org/software/gawk/manual/html_node/Time-Functions.html#Time-Functions].
strftime([format [, timestamp[, utc-flag]]])
Форматирует timestamp в соответствии со спецификацией в format. Если utc-flag присутствует и имеет ненулевое или непустое значение, результат будет в UTC, в противном случае результат будет в локальном времени. Временная метка должна быть того же формата, что и возвращает systime(). Если timestamp отсутствует, используется текущее время суток. Если format отсутствует, используется формат по умолчанию, эквивалентный выводу команды date. Формат по умолчанию доступен в PROCINFO["strftime"]. См. спецификацию функции strftime() в ISO C для описания преобразований форматов, которые гарантированно доступны.
systime()
Возвращает текущее время суток в виде количества секунд, прошедших с начала эпохи (1970-01-01 00:00:00 UTC в системах POSIX).
Функции для выполнения битовых операций
Gawk предоставляет следующие функции для выполнения битовых операций. Они работают путем преобразования значений с плавающей точкой двойной точности в целые числа типа uintmax_t, выполнения операции и затем преобразования результата обратно в число с плавающей точкой. Передача отрицательных операндов в любую из этих функций приводит к фатальной ошибке.
Функции:
and(v1, v2 [, ...])
Возвращает результат побитового И (AND) значений, предоставленных в списке аргументов. Должно быть не менее двух аргументов.
compl(val)
Возвращает результат побитового дополнения (NOT) значения val.
lshift(val, count)
Возвращает значение val, сдвинутое влево на count битов.
or(v1, v2 [, ...])
Возвращает результат побитового ИЛИ (OR) значений, предоставленных в списке аргументов. Должно быть не менее двух аргументов.
rshift(val, count)
Возвращает значение val, сдвинутое вправо на count битов.
xor(v1, v2 [, ...])
Возвращает результат побитового исключающего ИЛИ (XOR) значений, предоставленных в списке аргументов. Должно быть не менее двух аргументов.
Функции для определения типа
Следующие функции предоставляют информацию о типе их аргументов.
isarray(x)
Возвращает true, если x является массивом, и false в противном случае.
typeof(x)
Возвращает строку, указывающую тип x. Строка будет одной из следующих: "array", "number", "regexp", "string", "strnum", "unassigned" или "undefined".
Функции интернационализации
Следующие функции могут использоваться в вашей программе AWK для перевода строк во время выполнения. Для получения полной информации см. https://www.gnu.org/software/gawk/manual/html_node/I18N-Functions.html#I18N-Functions.
bindtextdomain(directory [, domain])
Указывает каталог, в котором gawk ищет файлы .gmo, в случае, если их нельзя или не нужно размещать в "стандартных" местах. Возвращает каталог, к которому привязан домен. Значение по умолчанию для домена — значение TEXTDOMAIN. Если directory — пустая строка (""), то bindtextdomain() возвращает текущую привязку для заданного домена.
dcgettext(string [, domain [, category]])
Возвращает перевод строки в текстовом домене domain для категории локали category. Значение по умолчанию для domain — текущее значение TEXTDOMAIN. Значение по умолчанию для category — "LC_MESSAGES".
dcngettext(string1, string2, number [, domain [, category]])
Возвращает форму множественного числа для числа number перевода строк string1 и string2 в текстовом домене domain для категории локали category. Значение по умолчанию для domain — текущее значение TEXTDOMAIN. Значение по умолчанию для category — "LC_MESSAGES".
Функции, возвращающие булевы значения
Вы можете создавать специальные значения булевого типа; см. руководство, чтобы узнать, как они работают и зачем они нужны.
mkbool(expression)
В зависимости от булева значения expression возвращает либо значение "истина", либо значение "ложь". Значения "истина" имеют числовое значение один. Значения "ложь" имеют числовое значение ноль.
ОПРЕДЕЛЯЕМЫЕ ПОЛЬЗОВАТЕЛЕМ ФУНКЦИИ
Функции в AWK определяются следующим образом:
function name(список параметров) { операторы }
Функции выполняются при вызове из выражений либо в шаблонах, либо в действиях. Фактические параметры, передаваемые при вызове функции, используются для инициализации формальных параметров, объявленных в функции. Массивы передаются по ссылке, другие переменные — по значению.
Локальные переменные объявляются как дополнительные параметры в списке параметров. Соглашение заключается в том, что локальные переменные отделяются от фактических параметров дополнительными пробелами в списке параметров. Например:
function f(p, q, a, b) # a и b — локальные
{
...
}
/abc/ { ... ; f(1, 2) ; ... }
Левая скобка в вызове функции должна непосредственно следовать за именем функции, без каких-либо промежуточных пробелов. Это ограничение не распространяется на встроенные функции, перечисленные выше.
Функции могут вызывать друг друга и могут быть рекурсивными. Параметры функций, используемые в качестве локальных переменных, инициализируются пустой строкой и нулем при вызове функции.
Используйте return expr для возврата значения из функции. Возвращаемое значение не определено, если значение не указано или если функция завершается "естественным" путем.
Функции могут вызываться косвенно. Для этого присвойте имя вызываемой функции в виде строки переменной. Затем используйте эту переменную, как если бы это было имя функции, с префиксом @, например: function myfunc() { print "myfunc called" ... }
{ ...
the_func = "myfunc"
@the_func() # вызов функции через the_func к myfunc
...
}
Если указан параметр --lint, gawk выдает предупреждение о вызовах неопределенных функций на этапе разбора, а не во время выполнения. Вызов неопределенной функции во время выполнения является фатальной ошибкой.
ДИНАМИЧЕСКАЯ ЗАГРУЗКА НОВЫХ ФУНКЦИЙ
Вы можете динамически добавлять новые функции, написанные на C или C++, в работающий интерпретатор gawk с помощью оператора @load. Полные сведения выходят за рамки данного руководства; см. https://www.gnu.org/software/gawk/manual/html_node/Dynamic-Extensions.html#Dynamic-Extensions.
СИГНАЛЫ
Профайлер gawk принимает два сигнала. SIGUSR1 приводит к тому, что он выводит профиль и стек вызовов функций в файл профиля, который либо awkprof.out, либо файл, указанный с помощью параметра --profile. Затем он продолжает работу. SIGHUP приводит к тому, что gawk выводит профиль и стек вызовов функций, а затем завершает работу.
ЛОКАЛИЗАЦИЯ
Строковые константы — это последовательности символов, заключенные в двойные кавычки. В неанглоязычной среде можно пометить строки в программе AWK как требующие перевода на местный язык. Такие строки в программе AWK помечаются знаком подчеркивания ("_") в начале. Например,
gawk 'BEGIN { print "hello, world" }'
всегда выводит hello, world. Но,
gawk 'BEGIN { print _"hello, world" }'
может вывести bonjour, monde во Франции. См. https://www.gnu.org/software/gawk/manual/html_node/Internationalization.html#Internationalization, чтобы узнать о шагах, необходимых для создания и запуска локализуемой программы AWK.
РАСШИРЕНИЯ GNU
Gawk имеет слишком большое количество расширений POSIX awk. Они описаны в https://www.gnu.org/software/gawk/manual/html_node/POSIX_002fGNU.html. Все расширения можно отключить, вызвав gawk с параметрами --traditional или --posix.
ПЕРЕМЕННЫЕ ОКРУЖЕНИЯ
Переменная среды AWKPATH может использоваться для предоставления списка каталогов, в которых gawk выполняет поиск при поиске файлов, указанных с помощью параметров -f, --file, -i и --include, а также директивы @include. Если первоначальный поиск не удался, путь снова просматривается после добавления суффикса .awk к имени файла.
Переменная среды AWKLIBPATH может использоваться для предоставления списка каталогов, в которых gawk выполняет поиск при поиске файлов, указанных с помощью параметров -l и --load.
Переменная среды GAWK_PERSIST_FILE, если она присутствует, указывает файл, который будет использоваться в качестве хранилища для постоянной памяти. Подробности см. в GAWK: Effective AWK Programming.
Переменная среды GAWK_READ_TIMEOUT может использоваться для указания времени ожидания в миллисекундах для чтения входных данных из терминала, канала или двухсторонней связи, включая сокеты.
Для подключения к удаленному хосту через сокет, GAWK_SOCK_RETRIES определяет количество попыток повтора, а GAWK_MSEC_SLEEP — интервал между попытками. Интервал задается в миллисекундах. В системах, которые не поддерживают usleep(3), значение округляется до целого числа секунд.
Если в окружении присутствует переменная POSIXLY_CORRECT, то gawk ведет себя точно так, как если бы в командной строке была указана опция --posix. Если указана опция --lint, gawk выдает предупреждающее сообщение об этом.
СТАТУС ВЫХОДА
Если оператор exit используется со значением, то gawk завершается с указанным числовым значением.
В противном случае, если во время выполнения не возникло проблем, gawk завершается со значением константы C EXIT_SUCCESS. Обычно это равно нулю.
Если произошла ошибка, gawk завершается со значением константы C EXIT_FAILURE. Обычно это равно единице.
Если gawk завершается из-за фатальной ошибки, статус выхода равен 2. В не-POSIX системах это значение может быть сопоставлено с EXIT_FAILURE.
ИНФОРМАЦИЯ О ВЕРСИИ
Эта страница руководства документирует gawk, версия 5.3.
АВТОРЫ
Первоначальная версия UNIX awk была разработана и реализована Альфредом Ахо, Питером Вайнбергером и Брайаном Керниганом из Bell Laboratories. Озан Йигит является текущим сопровождающим. Брайан Керниган время от времени участвует в его разработке.
Пол Рубин и Джей Фенласон из Free Software Foundation написали gawk для обеспечения совместимости с исходной версией awk, распространяемой в Seventh Edition UNIX. Джон Вудс внес ряд исправлений ошибок. Дэвид Труман, при участии Арнольда Роббинса, сделал gawk совместимым с новой версией UNIX awk. Арнольд Роббинс является текущим сопровождающим.
См. GAWK: Effective AWK Programming для получения полного списка участников, работавших над gawk и его документацией.
См. файл README в дистрибутиве gawk для получения актуальной информации о сопровождающих и о том, какие порты в настоящее время поддерживаются.
ОТПРАВКА ОТЧЕТОВ ОБ ОШИБКАХ И ЗАДАЧА ВОПРОСОВ
Если вы обнаружили ошибку в gawk, используйте программу gawkbug(1) для ее сообщения.
Полные инструкции по сообщению об ошибке приведены по адресу https://www.gnu.org/software/gawk/manual/html_node/Bugs.html. Пожалуйста, внимательно прочитайте и следуйте приведенным инструкциям. Это упростит сообщение об ошибках и ее устранение для всех участников.
С другой стороны, если у вас есть вопрос о том, как выполнить ту или иную задачу с помощью awk или gawk, отправьте электронное письмо по адресу _ с вашим запросом о помощи.
ОШИБКИ
Опция -F не нужна, учитывая возможность назначения переменных в командной строке; она остается только для обратной совместимости.
Эта страница руководства слишком длинная; у gawk слишком много функций.
ССЫЛКИ
^ grep(1), sed(1), gawkbug(1), printf(3), и strftime(3).
The AWK Programming Language, второе издание, Альфред В. Ахо, Брайан В. Керниган, Питер Дж. Вайнбергер, Addison-Wesley, 2023. ISBN 9-780138-269722.
GAWK: Effective AWK Programming, издание 5.3, поставляется с исходным кодом gawk. Текущая версия этого документа доступна в Интернете по адресу https://www.gnu.org/software/gawk/manual.
Документация GNU gettext доступна в Интернете по адресу https://www.gnu.org/software/gettext.
ПРИМЕРЫ
Вывод и сортировка имен всех пользователей:
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") }'
ПРАВА НА КОПИРОВАНИЕ
Авторское право © 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002, 2003, 2004, 2005, 2007, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025 Free Software Foundation, Inc.
Разрешается создавать и распространять дословные копии данной страницы руководства при условии, что уведомление об авторском праве и данное уведомление о разрешении сохраняются на всех копиях.
Разрешается копировать и распространять измененные версии данной страницы руководства на условиях, применимых к дословной копии, при условии, что вся полученная производная работа распространяется на условиях уведомления о разрешении, идентичного этому.
Разрешается копировать и распространять переводы данной страницы руководства на другой язык на условиях, применимых к измененным версиям, за исключением того, что данное уведомление о разрешении может быть представлено в переводе, утвержденном Фондом.