awk gawk — язык сканирования и обработки шаблонов
gawk [ POSIX or GNU style options ] -f program-file [ - - ] file . . .
gawk [ POSIX or GNU style options ] [ - - ] program-text file . . .
Gawk — это реализация проекта GNU языка программирования AWK. Он соответствует определению языка в стандарте POSIX 1003.1. Эта версия, в свою очередь, основана на описании в книге Язык программирования AWK, написанной Ахо, Керниганом и Вайнбергером. Gawk предоставляет дополнительные функции, имеющиеся в текущей версии awk Брайана Кернигана, а также многочисленные расширения GNU.
Командная строка состоит из параметров самого gawk, текста программы AWK (если он не указан с помощью параметров -f или - -include), и значения, которые должны быть доступны в предопределенных переменных AWK ARGC и ARGV.
Эта страница руководства намеренно сделана как можно более краткой. Полная информация представлена в GAWK: эффективное программирование AWK, и вам следует поискать там полное описание любой конкретной функции. Там, где это возможно, даны ссылки на онлайн-версию руководства.
Параметры Gawk могут быть либо традиционными однобуквенными параметрами в стиле POSIX, либо длинными параметрами в стиле GNU. Опции POSIX начинаются с одного «-», а длинные опции начинаются с «- -». Длинные параметры предоставляются как для функций, специфичных для GNU, так и для функций, требуемых POSIX.
Параметры Gawk обычно используются в виде длинных параметров. Аргументы длинных опций либо соединяются с опцией знаком = без промежуточных пробелов, либо они могут быть предоставлены в следующем аргументе командной строки. Длинные варианты могут быть сокращены, если аббревиатура остается уникальной.
Кроме того, у каждой длинной опции есть соответствующая короткая опция, так что функциональность этой опции может использоваться из исполняемых скриптов #!.
Gawk поддерживает следующие параметры. Стандартные параметры перечислены первыми, за ними следуют параметры для расширений gawk, перечисленные в алфавитном порядке по кратким параметрам.
- -file файл-программы Читать исходный код программы AWK из файла файл-программы, а не из первого аргумента командной строки. Можно использовать несколько параметров -f. Файлы, прочитанные с помощью -f, обрабатываются так, как если бы они начинались с неявного оператора @namespace "awk".
- -field-separator fs Используйте fs в качестве разделителя полей ввода (значение предопределенной переменной FS). .
Присвойте значение val переменной var перед началом выполнения программы. Такие значения переменных доступны правилу BEGIN программы AWK.
- -characters-as-bytes Обрабатывать все входные данные как однобайтовые символы. Параметр - -posix переопределяет этот параметр.
- -Традиционный Запуск в режиме совместимости. В режиме совместимости gawk ведет себя так же, как awk Брайана Кернигана; ни одно из специфичных для GNU расширений не распознается.
- -copyright Вывести краткую версию информационного сообщения GNU об авторских правах на стандартный вывод и успешно завершить работу.
Распечатайте отсортированный список глобальных переменных, их типов и окончательных значений в файл. Файл по умолчанию — awkvars.out в текущем каталоге.
Включите отладку программ AWK. По умолчанию отладчик интерактивно считывает команды с клавиатуры (стандартный ввод). Необязательный аргумент file указывает файл со списком команд, которые отладчик должен выполнять неинтерактивно.
В этом режиме выполнения gawk загружает исходный код AWK, а затем запрашивает команды отладки. Gawk может отлаживать только исходный код программы AWK, указанный с параметрами -f и - -include. Отладчик описан в документе GAWK: Effective AWK Programming; см. https://www.gnu.org/software/gawk/manual/html_node/Debugger.html#Debugger.
- -source текст программы Использовать текст программы в качестве исходного кода программы AWK. Каждый аргумент, переданный с помощью -e, обрабатывается так, как если бы он начинался с неявного оператора @namespace "awk".
Аналогично -f, однако эта опция обрабатывается последней. Это следует использовать со сценариями #!, особенно для приложений CGI, чтобы избежать передачи параметров или исходного кода (!) в командной строке с URL-адреса. Этот параметр отключает назначение переменных командной строки.
- -gen-pot Отсканируйте и проанализируйте программу AWK и сгенерируйте файл формата GNU .pot (шаблон переносимого объекта) на стандартном выходе с записями для всех локализуемых строк в программа. Сама программа не выполняется.
- -help Напечатайте относительно краткую сводку доступных опций в стандартный вывод. Согласно Стандартам кодирования GNU, эти параметры вызывают немедленный успешный выход.
Загрузите исходную библиотеку awk. Это ищет библиотеку, используя переменную среды AWKPATH. Если первоначальный поиск не удался, будет предпринята еще одна попытка после добавления суффикса .awk. Файл будет загружен только один раз (т. е. исключаются дубликаты), и код не является основным исходным кодом программы. Файлы, прочитанные с помощью - -include, обрабатываются так, как будто они начинаются с неявного оператора @namespace "awk".
- -trace Вывести имена внутренних кодов байтов по мере их выполнения при запуске программы. Трассировка печатается со стандартной ошибкой. Каждому ``коду операции'' в выводе предшествует знак +.
- -load lib Загрузить расширение gawk из общей библиотеки lib. Это ищет библиотеку, используя переменную среды AWKLIBPATH. Если первоначальный поиск не удался, будет предпринята еще одна попытка после добавления суффикса общей библиотеки по умолчанию для платформы. Ожидается, что процедура инициализации библиотеки будет называться dl_load().
Предоставляйте предупреждения о конструкциях, которые являются сомнительными или не переносимыми на другие реализации AWK. См. https://www.gnu.org/software/gawk/manual/html_node/Options.html#Options для списка возможных значений для value.
- -bignum Принудительная арифметика с произвольной точностью для чисел. Эта опция не работает, если gawk не скомпилирован для использования библиотек GNU MPFR и GMP. (В таком случае gawk выдает предупреждение.)
ПРИМЕЧАНИЕ. Эта функция предоставляется условно-досрочно. Основной сопровождающий gawk больше не поддерживает его, хотя есть член команды разработчиков, который поддерживает его. Если эта ситуация изменится, функция будет удалена из gawk.
Установите GAWK_NO_MPFR_WARN в среде, чтобы отключить предупреждение.
- -non-decimal-data Распознавание восьмеричных и шестнадцатеричных значений во входных данных. Используйте этот параметр с большой осторожностью!
- -use-lc-numeric Заставить gawk использовать символ десятичной точки локали при анализе входных данных.
- -nostalgia Подарите момент ностальгии давним пользователям awk.
Выведите распечатанную версию программы в файл. Файл по умолчанию — awkprof.out в текущем каталоге. Этот параметр подразумевает - -без оптимизации.
- -optimize Включить оптимизацию gawk по умолчанию для внутреннего представления программы. Эта опция включена по умолчанию.
Запустите сеанс профилирования и отправьте данные профилирования в prof-file. По умолчанию это awkprof.out в текущем каталоге. Профиль содержит счетчики выполнения каждого оператора в программе в левом поле и счетчики вызовов функций для каждой определяемой пользователем функции. Gawk в этом режиме работает медленнее. Этот параметр подразумевает - -без оптимизации.
- -posix Включает режим совместимости и отключает ряд распространенных расширений.
- -re-interval Включить использование интервальных выражений при сопоставлении регулярных выражений. Интервальные выражения включены по умолчанию, но этот параметр остается для обратной совместимости.
- -no-optimize Отключить оптимизацию gawk по умолчанию для внутреннего представления программы.
- -sandbox Запустить gawk в режиме песочницы, отключить функцию system(), перенаправить ввод с помощью getline, вывести перенаправление с помощью print и printf и загрузка динамических расширений. Выполнение команд (через конвейеры) также отключено.
- -lint-old Предупреждает о конструкциях, которые нельзя перенести в исходную версию UNIX awk.
- -version Вывести информацию о версии для этой конкретной копии gawk на стандартный вывод. Это полезно при сообщении об ошибках. Согласно Стандартам кодирования GNU, эти параметры вызывают немедленный успешный выход.
Сигнал об окончании опций. Это полезно, чтобы позволить дальнейшим аргументам самой программы AWK начинаться с «-».
В режиме совместимости любые другие параметры помечаются как недопустимые, но в остальном игнорируются. При нормальной работе, пока предоставляется текст программы, неизвестные параметры передаются программе AWK в массиве ARGV для обработки.
Для совместимости с POSIX можно использовать параметр -W, за которым следует длинное имя параметра.
Программа AWK состоит из последовательности необязательных директив, шаблонов действий и необязательных определений функций.
@include "filename " @load "filename " @namespace "name " pattern { action statements } function name(parameter list) { statements }
Gawk сначала читает исходный код программы из файла-программы, если он указан, из аргументов в - -source или из первого не аргумент -option в командной строке. Параметры -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, создает любые промежуточные поля с нулевым string в качестве их значений и приводит к пересчету значения $0, при этом поля разделяются значением OFS. Ссылки на поля с отрицательными номерами вызывают фатальную ошибку. Уменьшение NF приводит к потере значений полей после нового значения и пересчету значения $0, при этом поля разделяются значением ОФС.
Присвоение значения существующему полю приводит к перестроению всей записи при ссылке на $0. Точно так же присвоение значения $0 приводит к повторному разбиению записи, создавая новые значения для полей.
Ниже перечислены встроенные переменные Gawk . Этот список намеренно краток. Подробнее см. на странице https://www.gnu.org/software/gawk/manual/html_node/Built_002din-Variables.
Количество аргументов командной строки.
Индекс в ARGV текущего обрабатываемого файла.
Массив аргументов командной строки. Массив индексируется от 0 до ARGC - 1.
В системах, отличных от POSIX, указывает использование «бинарного» режима для всех файловых операций ввода-вывода. Подробнее см. https://www.gnu.org/software/gawk/manual/html_node/PC-Using.html.
Формат преобразования чисел: ".6g" по умолчанию.
Массив, содержащий значения текущей среды. Массив индексируется переменными среды, каждый элемент которых является значением этой переменной.
Если системная ошибка возникает при перенаправлении для getline, во время чтения для getline или во время close(), тогда ERRNO — это строка, описывающая ошибку. Значение подлежит переводу в неанглоязычных регионах.
Список значений ширины полей, разделенных пробелами. Когда установлено, gawk анализирует ввод в поля фиксированной ширины вместо использования значения переменной FS в качестве разделителя полей. Каждой ширине поля может предшествовать разделенное двоеточием значение, указывающее количество символов, которые необходимо пропустить перед началом поля.
Имя текущего входного файла. Если в командной строке файлы не указаны, значение FILENAME равно «-». Однако FILENAME не определено в правиле BEGIN (если только оно не установлено getline).
Номер входной записи в текущем входном файле.
Регулярное выражение, описывающее содержимое полей в записи. Когда установлено, gawk анализирует ввод в поля, где поля соответствуют регулярному выражению, вместо использования значения FS в качестве разделителя полей.
Разделитель полей ввода, по умолчанию пробел. Подробнее см. на странице https://www.gnu.org/software/gawk/manual/html_node/Field-Separators.html.
Массив, индексы и соответствующие значения которого являются именами всех пользовательских или расширенных функций в программе. ПРИМЕЧАНИЕ. Вы не можете использовать оператор delete с массивом FUNCTAB.
Управляет регистрозависимостью всех операций с регулярными выражениями и строками. Подробнее см. на странице https://www.gnu.org/software/gawk/manual/html_node/Case_002dsensitivity.html.
Обеспечивает динамическое управление параметром - -lint из программы AWK.
Количество полей в текущей входной записи.
Общее количество входных записей, просмотренных на данный момент.
Выходной формат для чисел ".6g" по умолчанию.
Разделитель полей вывода, по умолчанию пробел.
Разделитель выходных записей, по умолчанию новая строка.
Рабочая точность чисел с плавающей запятой произвольной точности, по умолчанию 53.
Элементы этого массива обеспечивают доступ к информации о работающей программе AWK. Подробнее см. https://www.gnu.org/software/gawk/manual/html_node/Auto_002dset.
Режим округления, используемый для арифметических вычислений с произвольной точностью, по умолчанию "N" (режим IEEE-754 roundTiesToEven). Подробнее см. на странице https://www.gnu.org/software/gawk/manual/html_node/Setting-the-rounding-mode.
Разделитель входных записей, по умолчанию новая строка.
Терминатор записи. Gawk устанавливает RT на входной текст, который соответствует символу или регулярному выражению, заданному RS.
Индекс первого символа, совпавшего с функцией match(); 0, если нет совпадений.
Длина строки, сопоставленной с помощью match(); -1, если нет совпадений.
Строка, используемая для разделения нескольких нижних индексов в элементах массива, по умолчанию "\034".
Массив, индексы которого являются именами всех определенных в данный момент глобальных переменных и массивов в программе. Вы не можете использовать оператор delete с массивом SYMTAB или назначать элементы с индексом, который не является именем переменной.
Текстовый домен программы AWK; используется для поиска локализованных переводов строк программы.
Массивы индексируются выражением в квадратных скобках ([ и ]). Если выражение представляет собой список выражений (выражение, выражение . . .), то нижний индекс массива представляет собой строку, состоящую из конкатенации (строкового) значения каждого выражения, разделенные значением переменной 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) в массиве.
Конструкцию 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"). Внутри строк распознаются определенные escape-последовательности, как в 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 /regular expression/ relational expression pattern && pattern pattern || pattern pattern ? pattern : pattern (pattern) ! pattern pattern1, pattern2
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. Если первый шаблон верен, то шаблон, используемый для тестирования, является вторым шаблоном, в противном случае - третьим. Оценивается только один из второго и третьего шаблонов.
Форма выражения шаблон1, шаблон2 называется шаблон диапазона. Он соответствует всем входным записям, начиная с записи, соответствующей шаблону1, и продолжается до записи, соответствующей шаблону2 включительно. Он не сочетается ни с каким другим видом выражения шаблона.
Операторы действий заключены в фигурные скобки { и }. Операторы действия состоят из обычных операторов присваивания, условных операторов и операторов цикла, которые можно найти в большинстве языков. Доступные операторы, управляющие операторы и операторы ввода-вывода созданы по образцу операторов C.
Операторы в AWK в порядке убывания приоритета:
Группировка
Ссылка на поле.
Увеличение и уменьшение, как префикса, так и постфикса.
Возведение в степень.
Унарный плюс, унарный минус и логическое отрицание.
Умножение, деление и модуль.
Сложение и вычитание.
Конкатенация строк.
Конвейерный ввод-вывод для getline, print и printf.
Обычные реляционные операторы.
Совпадение с регулярным выражением, совпадение с отрицанием.
Членство в массиве.
Логическое И.
Логическое ИЛИ.
Условное выражение C. Это имеет вид expr1 ? выражение2 : выражение3 . Если выражение1 истинно, значением выражения является выражение2, в противном случае — выражение3. Вычисляется только одно из expr2 и expr3.
Назначение. Как абсолютное присваивание (var=значение), так и операторное присваивание (другое формы) поддерживаются.
Операторы управления следующие:
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 ] }
Операторы ввода/вывода следующие:
Закройте открытый файл, канал или сопроцесс. Необязательный параметр how следует использовать только при закрытии одного конца двустороннего канала для совместного процесса. Это должно быть строковое значение, либо "to", либо "from".
Установить $0 из следующей входной записи; установите NF, NR, FNR, RT.
Установить $0 из следующей записи файла; установите NF, RT.
Установить var из следующей входной записи; установите NR, FNR, RT.
Установить var из следующей записи файла; установите RT.
Запустите command, направив вывод либо в $0, либо в var, как указано выше, и RT.
Запустите command в качестве сопроцесса, передающего выходные данные либо в $0, либо в var, как указано выше, и RT. (команда также может быть сокетом. См. подраздел Специальные имена файлов ниже.)
Сбросить все буферы, связанные с открытым выходным файлом или каналом file. Если file отсутствует или это пустая строка, сбросить все открытые выходные файлы и каналы.
Остановить обработку текущей входной записи. Прочитайте следующую входную запись и начните обработку с первого шаблона в программе AWK. По достижении конца входных данных выполните любое правило (правила) END.
Остановить обработку текущего входного файла. Следующая прочитанная входная запись поступает из следующего входного файла. Обновите FILENAME и ARGIND, сбросьте FNR на 1 и начните обработку с первого шаблона в программе AWK. По достижении конца входных данных выполните все правила ENDFILE и END.
Распечатать текущую запись. Выходная запись завершается значением ORS.
Распечатайте выражения. Каждое выражение отделяется значением OFS. Выходная запись завершается значением ORS.
Напечатать выражения в файле. Каждое выражение отделяется значением OFS. Выходная запись завершается значением ORS.
Отформатируйте и распечатайте.
Отформатируйте и распечатайте файл.
Выполните команду cmd-line и верните статус выхода. (Это может быть недоступно в системах, отличных от POSIX). полная информация о статусе выхода.
Дополнительные перенаправления вывода разрешены для print и printf.
Добавьте выходные данные в файл.
Пишите на трубе.
Отправить данные в сопроцесс или сокет. (См. также подраздел Специальные имена файлов ниже.)
Команда getline возвращает 1 в случае успеха, ноль в случае конца файла и -1 в случае ошибки. Если значение errno(3) указывает, что операцию ввода-вывода можно повторить, и PROCINFO["input ", " RETRY"], то возвращается -2 вместо -1, и могут быть предприняты дальнейшие вызовы getline. В случае ошибки ERRNO устанавливается в строку, описывающую проблему.
ПРИМЕЧАНИЕ. Сбой при открытии двустороннего сокета приводит к тому, что вызывающая функция возвращает нефатальную ошибку. При использовании конвейера, сопроцессора или сокета для getline или из print или printf в цикле вы должны используйте close() для создания новых экземпляров команды или сокета. AWK не закрывает каналы, сокеты или сопроцессы автоматически, когда они возвращают EOF.
Версии оператора printf и функции sprintf() в AWK аналогичны версиям C. Подробнее см. https://www.gnu.org/ software/gawk/manual/html_node/Printf.html.
При перенаправлении ввода-вывода с print или printf в файл или через getline из файла глазком распознает некоторые специальные имена файлов внутри. Эти имена файлов позволяют получить доступ к открытым файловым дескрипторам, унаследованным от родительского процесса gawk (обычно оболочки). Эти имена файлов также могут использоваться в командной строке для именования файлов данных. Имена файлов:
Стандартный ввод.
Стандартный ввод.
Стандартный вывод.
Стандартный вывод ошибок.
Файл, связанный с дескриптором открытого файла 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 имеет следующие встроенные арифметические функции:
Возвращает арктангенс y/x в радианах.
Возвращает косинус выражения expr в радианах.
Экспоненциальная функция.
Усечь до целого числа.
Сократите число и номинал до целых чисел. Возвращает частное число, деленное на номинал, в result["частное"] и остаток в результат["остаток"]. Это расширение gawk, полезное прежде всего при работе с произвольно большими целыми числами.
Функция натурального логарифма.
Возвращает случайное число N от нуля до единицы, такое что 0 ≤ N < 1.
Возвращает синус expr в радианах.
Возвращает квадратный корень из expr.
Используйте expr в качестве нового начального числа для генератора случайных чисел. Если выражение не указано, используйте время суток. Вернуть предыдущее начальное число для генератора случайных чисел.
Gawk имеет следующие встроенные строковые функции; подробности приведены на странице https://www.gnu.org/software/gawk/manual/html_node/String-Functions.
Возвращает количество элементов в исходном массиве s. Отсортируйте содержимое s, используя обычные правила gawk для сравнения значений, и замените индексы отсортированных значений s последовательными целыми числами, начинающимися с 1. Если указан необязательный целевой массив d, сначала продублируйте s в d, а затем отсортируйте d, оставляя индексы исходного массива s без изменений. Необязательная строка how управляет направлением и режимом сравнения. Допустимые значения для как описаны в https://www.gnu.org/software/gawk/manual/html_node/String-Functions.html#String-Functions. s и d могут быть одним и тем же массивом; это имеет смысл только при предоставлении третьего аргумента.
Возвращает количество элементов в исходном массиве s. Поведение такое же, как и у asort(), за исключением того, что для сортировки используются индексы массива, а не значения массива. Когда это сделано, массив индексируется численно, а значения соответствуют исходным индексам. Исходные значения теряются; таким образом, предоставьте второй массив, если вы хотите сохранить оригинал. Назначение дополнительной строки how такое же, как и для asort(). Здесь также допускается, чтобы s и d были одним и тем же массивом; это имеет смысл только при предоставлении третьего аргумента.
Найдите в целевой строке t совпадения с регулярным выражением r. Если h — это строка, начинающаяся с g или G, замените все совпадения r на s . В противном случае h — это число, указывающее, какое совпадение r нужно заменить. Если t не указан, используйте вместо него $0. В тексте замены s последовательность \n, где n — цифра от 1 до 9, может использоваться для указания только текста, который соответствует n-му подвыражению в скобках. Последовательность \0 представляет весь соответствующий текст, как и символ &. В отличие от sub() и gsub(), измененная строка возвращается как результат функции, а исходная целевая строка не изменяется. .
Для каждой подстроки, соответствующей регулярному выражению r в строке t, замените строку s и верните количество замен. Если t не указан, используйте $0. Знак & в замещающем тексте заменяется фактически совпавшим текстом. Используйте \&, чтобы получить буквальное &. (Это должно быть введено как "\\&"; см. https://www.gnu.org/software/gawk/manual/html_node/Gory-Details.html#Gory-Details. для более полного обсуждения правил использования амперсандов и обратной косой черты в тексте замены sub(), gsub() и gensub().)
Возвращает индекс строки t в строке s или ноль, если t отсутствует. (Это означает, что индексы символов начинаются с единицы.)
Возвращает длину строки s или длину $0, если s не указано. С аргументом массива length() возвращает количество элементов в массиве.
Возвращает позицию в s, где встречается регулярное выражение r, или ноль, если r отсутствует, и устанавливает значения RSTART и RLENGTH. Обратите внимание, что порядок аргументов такой же, как и для оператора ~: str ~ re.
См. https://www.gnu.org/software/gawk/manual/html_node/String-Functions.html#String-Functions для описания того, как массив a заполняется, если он указан.
Разделите строку s на массив a и массив разделителей seps в регулярном выражении r и верните количество полей. Значения элементов — это части s, соответствующие r. Значение seps[i] – это возможный нулевой разделитель, который появляется после a[i]. Значение seps[0] — это, возможно, нулевой начальный разделитель. Если r опущен, вместо него используется FPAT. Сначала очищаются массивы a и seps. Разделение ведет себя так же, как разделение полей с помощью FPAT.
Разделите строку s на массив a и массив разделителей seps в регулярном выражении r и верните количество полей. Если r опущено, вместо него используется FS. Сначала очищаются массивы a и seps. seps[i] – это разделитель полей, соответствующий r между a[<i] и a[i+1]. Разделение ведет себя так же, как и разделение поля .
Распечатайте expr-list в соответствии с fmt и верните результирующую строку.
Изучите str и верните его числовое значение. Если str начинается с начального 0, интерпретируйте его как восьмеричное число. Если str начинается с начального 0x или 0X, рассматривайте его как шестнадцатеричное число. В противном случае предположим, что это десятичное число.
Аналогично gsub(), но заменяет только первую совпадающую подстроку. Возвращает либо ноль, либо единицу.
Возвращает не более чем n-символьную подстроку s, начиная с i. Если n опущен, используйте остальные s.
Возвращает копию строки str со всеми символами верхнего регистра в str, преобразованными в соответствующие символы нижнего регистра. Неалфавитные символы остаются без изменений.
Возвращает копию строки str со всеми символами нижнего регистра в str, переведенными в соответствующие символы верхнего регистра. Неалфавитные символы остаются без изменений.
Gawk поддерживает многобайтность. Это означает, что index(), length(), substr() и match() работают в терминах символов, а не байтов.
Gawk предоставляет следующие функции для получения меток времени и их форматирования. Подробности приведены на странице https://www.gnu.org/software/gawk/manual/html_node/Time-Functions.
Превратите datespec в отметку времени той же формы, что и systime(), и верните результат. Если utc-flag присутствует и не равен нулю или не равен нулю, предполагается, что время находится в часовом поясе UTC; в противном случае предполагается, что время находится в местном часовом поясе. Если datespec содержит недостаточно элементов или если полученное время выходит за пределы допустимого диапазона, mktime() возвращает -1. См. https://www.gnu.org/software/gawk/manual/html_node/Time-Functions.html#Time-Functions для получения подробной информации о спецификации даты.
Отформатируйте timestamp в соответствии со спецификацией в format. Если utc-flag присутствует и не равен нулю или не равен нулю, результат будет в формате UTC, в противном случае результат будет в местном времени. Временная метка должна иметь ту же форму, что и функция systime(). Если отметка времени отсутствует, используется текущее время суток. Если format отсутствует, используется формат по умолчанию, эквивалентный выходным данным date(1). Формат по умолчанию доступен в PROCINFO["strftime"]. См. спецификацию функции strftime() в ISO C для гарантированно доступных преобразований формата.
Возвращает текущее время суток как количество секунд, прошедших с начала эпохи (1970-01-01 00:00:00 UTC в системах POSIX).
Gawk предоставляет следующие функции обработки битов. Они работают путем преобразования значений с плавающей запятой двойной точности в целые числа uintmax_t, выполнения операции, а затем преобразования результата обратно в число с плавающей запятой. Передача отрицательных операндов любой из этих функций приводит к фатальной ошибке.
Функции:
Возвращает побитовое И значений, представленных в списке аргументов. Их должно быть не менее двух.
Возвращает побитовое дополнение val.
Возвращает значение val, сдвинутое влево на count бит.
Возвращает побитовое ИЛИ значений, представленных в списке аргументов. Их должно быть не менее двух.
Возвращает значение val, сдвинутое вправо на count бит.
Возвращает побитовое XOR значений, представленных в списке аргументов. Их должно быть не менее двух.
Следующие функции предоставляют связанную с типом информацию о своих аргументах.
Возвращает true, если x является массивом, иначе false.
Возвращает строку, указывающую тип x. Строка может быть одной из следующих: "массив", "число", "регулярное выражение", "строка", "strnum", "unassigned" или "undefined".
Следующие функции могут использоваться внутри вашей программы AWK для перевода строк во время выполнения. Полную информацию см. на странице https://www.gnu.org/software/gawk/manual/html_node/I18N-Functions.html#I18N-Functions.
Укажите каталог, в котором gawk ищет файлы .gmo на случай, если они не будут или не могут быть размещены в "стандартных" местах. Он возвращает каталог, к которому привязан домен.
домен по умолчанию — это значение TEXTDOMAIN. Если directory является пустой строкой (""), то bindtextdomain() возвращает текущую привязку для заданного домена .
Вернуть перевод string в текстовом домене domain для категории локали category. Значением по умолчанию для domain является текущее значение TEXTDOMAIN. Значением по умолчанию для категории является "LC_MESSAGES".
Возвращает форму множественного числа, используемую для номера перевода string1 и string2 в текстовом домене domain для категории локали <категория. Значением по умолчанию для domain является текущее значение TEXTDOMAIN. Значением по умолчанию для категории является "LC_MESSAGES".
Вы можете создавать специальные логические значения; см. руководство о том, как они работают и почему они существуют.
В зависимости от логического значения выражения возвращается либо истинное значение, либо ложное значение. Истинные значения имеют числовое значение один. Ложные значения имеют нулевое числовое значение.
Функции в AWK определяются следующим образом:
функция имя(список параметров) { инструкции
Функции выполняются, когда они вызываются из выражений либо в шаблонах, либо в действиях. Фактические параметры, переданные в вызове функции, используются для создания формальных параметров, объявленных в функции. Массивы передаются по ссылке, остальные переменные передаются по значению.
Локальные переменные объявлены как дополнительные параметры в списке параметров. Соглашение состоит в том, чтобы отделять локальные переменные от реальных параметров дополнительными пробелами в списке параметров. Например:
function f(p, q, a, b) # a and b are local { . . . } /abc/ { . . . ; f(1, 2) ; . . . }
Левая скобка в вызове функции должна следовать сразу за именем функции, без промежуточных пробелов. Это ограничение не распространяется на перечисленные выше встроенные функции.
Функции могут вызывать друг друга и могут быть рекурсивными. Параметры функции, используемые в качестве локальных переменных, инициализируются нулевой строкой и нулевым числом при вызове функции.
Используйте выражение return, чтобы вернуть значение из функции. Возвращаемое значение не определено, если значение не указано, или если функция возвращается, «выпадая» из конца.
Функции могут вызываться косвенно. Для этого присвойте имя вызываемой функции в виде строки переменной. Затем используйте переменную, как если бы это было имя функции, с префиксом @, например так:
function myfunc() { print "myfunc called" . . . } { . . . the_func = "myfunc" @the_func() # call through the_func to 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, либо любой другой файл с именем, содержащим - -профиль. вариант. Затем он продолжает работать. SIGHUP заставляет gawk выгрузить профиль и стек вызовов функций, а затем завершить работу.
Строковые константы — это последовательности символов, заключенные в двойные кавычки. В неанглоязычных средах можно пометить строки в программе AWK как требующие перевода на местный естественный язык. Такие строки помечаются в программе AWK знаком подчеркивания ("_"). Например,
gawk 'BEGIN { print "hello, world" }'
всегда печатает привет, мир. Но,
gawk 'BEGIN { print _"hello, world" }'
может напечатать bonjour, monde во Франции. См. https://www.gnu.org/software/gawk/manual/html_node/Internationalization.html#Internationalization, чтобы узнать об этапах создания и запуска локализуемой программы AWK.
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 и - -загрузить параметры.
Переменная среды GAWK_PERSIST_FILE, если она присутствует, указывает файл, который следует использовать в качестве резервного хранилища для постоянной памяти. Это экспериментальная функция. Дополнительные сведения см. в разделе GAWK: эффективное программирование AWK.
Переменная среды GAWK_READ_TIMEOUT может использоваться для указания времени ожидания в миллисекундах для чтения ввода с терминала, конвейера или двусторонней связи, включая сокеты.
Для подключения к удаленному хосту через сокет GAWK_SOCK_RETRIES управляет количеством повторных попыток, а GAWK_MSEC_SLEEP интервалом между повторными попытками. Интервал в миллисекундах. В системах, не поддерживающих usleep(3), значение округляется до целого числа секунд.
Если в среде существует POSIXLY_CORRECT, то gawk ведет себя точно так же, как если бы в командной строке было указано - -posix. Если был указан - -lint, gawk выдает предупреждающее сообщение по этому поводу.
Установите GAWK_NO_MPFR_WARN в среде, чтобы отключить предупреждение о том, что режим MPFR устарел.
Если оператор exit используется со значением, то gawk завершает работу с заданным ему числовым значением.
В противном случае, если во время выполнения не возникло проблем, gawk завершает работу со значением константы C EXIT_SUCCESS. Обычно это ноль.
При возникновении ошибки gawk завершает работу со значением константы C EXIT_FAILURE. Обычно это один.
Если gawk завершает работу из-за фатальной ошибки, статус выхода равен 2. В системах, отличных от POSIX, это значение может быть сопоставлено с EXIT_FAILURE.
Эта справочная страница документирует gawk версии 5.2.
Первоначальная версия UNIX awk была разработана и реализована Альфредом Ахо, Питером Вайнбергером и Брайаном Керниганом из Bell Laboratories. Брайан Керниган продолжает поддерживать и улучшать его.
Пол Рубин и Джей Фенласон из Free Software Foundation написали gawk, чтобы он был совместим с исходной версией awk, распространяемой в седьмой редакции UNIX. Джон Вудс внес ряд исправлений ошибок. Дэвид Труман при содействии Арнольда Роббинса сделал gawk совместимым с новой версией UNIX awk. Арнольд Роббинс является текущим сопровождающим.
См. GAWK: эффективное программирование AWK для получения полного списка участников gawk и его документации.
См. файл README в дистрибутиве gawk для получения актуальной информации о сопровождающих и поддерживаемых в настоящее время портах.
Если вы обнаружили ошибку в gawk, сообщите об этом с помощью программы gawkbug(1).
Полные инструкции по сообщению об ошибке приведены на странице https://www.gnu.org/software/gawk/manual/html_node/Bugs.html. Пожалуйста внимательно прочтите приведенные там инструкции и следуйте им. Это значительно облегчит сообщение об ошибках и их устранение для всех участников. Действительно.
Параметр -F необязателен, учитывая функцию назначения переменных командной строки; остается только для обратной совместимости.
Эта страница руководства слишком длинная; gawk имеет слишком много функций.
egrep(1), sed(1), gawkbug(1), printf(3), and strftime(3).
The AWK Programming Language, Alfred V. Aho, Brian W. Kernighan, Peter J. Weinberger, Addison-Wesley, 1988. ISBN 0-201-07981-X.
GAWK: Effective AWK Programming, Edition 5.2, shipped with the gawk source. The current version of this document is available online at https://www.gnu.org/software/gawk/manual.
The GNU gettext documentation, available online at https://www.gnu.org/software/gettext.
Print and sort the login names of all users:
BEGIN { FS = ":" }
{ print $1 | "sort" }
Count lines in a file:
{ nlines++ }
END { print nlines }
Precede each line by its number in the file:
{ print FNR, $0 }
Concatenate and line number (a variation on a theme):
{ print NR, $0 }
Run an external command for particular lines of data:
tail -f access_log |
awk '/myhome.html/ { system("nmap " $1 ">> logdir/myhome.html") }'
Брайан Керниган оказал ценную помощь во время тестирования и отладки. Мы благодарим его.
Copyright © 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 Фонд свободного программного обеспечения, Inc.
Разрешается делать и распространять дословные копии этой страницы руководства при условии, что уведомление об авторских правах и это уведомление о разрешении сохраняются на всех копиях.
Разрешено обрабатывать этот файл с помощью troff и распечатывать результаты при условии, что распечатанный документ содержит уведомление о разрешении на копирование, идентичное этому, за исключением удаления этого абзаца (этот абзац не имеет отношения к распечатанной странице руководства).
Разрешается копировать и распространять измененные версии этой страницы руководства на условиях дословного копирования, при условии, что вся полученная производная работа распространяется на условиях уведомления о разрешении, идентичного настоящему.
Разрешается копировать и распространять переводы этой страницы руководства на другой язык при указанных выше условиях для измененных версий, за исключением того, что это уведомление о разрешении может быть указано в переводе, одобренном Фондом.