Язык обработки шаблонов awk
Awk — скриптовый язык построчного разбора и обработки входного потока (например, текстового файла) по заданным шаблонам (регулярным выражениям). Часто используется в сценариях командной строки. С помощью языка awk можно выполнять следующие действия:
- Объявлять переменные для хранения данных.
- Использовать арифметические и строковые операторы для работы с данными.
- Использовать управляющие операторы и циклы, что позволяет реализовать сложные алгоритмы.
- Создавать форматированные отчёты.
Вызов awk выглядит так:
Awk рассматривает входной поток как набор записей. Каждая запись делится на поля. По умолчанию разделителем записей является символ новой строки (то есть записи — это строки), разделителем полей — символ пробела или табуляции. Символы-разделители можно явно определить в программе.
- -F fs — позволяет указать символ-разделитель для полей в записи.
- -f file — указывает имя файла, из которого нужно прочесть awk-скрипт.
- -v var=value — позволяет объявить переменную и задать её значение по умолчанию.
- -mf N — задаёт максимальное число полей для обработки в файле данных.
- -mr N — задаёт максимальный размер записи в файле данных.
Чтение awk-скриптов из командной строки
Скрипты awk, которые можно писать прямо в командной строке, оформляются в виде текстов команд, заключённых в фигурные скобки. Кроме того, текст скрипта нужно заключить в одинарные кавычки:
При вызове не указан файл с данными, поэтому awk ожидает поступления данных из STDIN . Чтобы завершить работу awk, нужно передать ему символ конца файла, воспользовавшись сочетанием клавиш CTRL+D .
Позиционные переменные, хранящие данные полей
Одна из основных функций awk заключается в возможности манипулировать данными в текстовых файлах. Делается это путём автоматического назначения переменной каждому элементу в строке. По умолчанию awk назначает следующие переменные каждому полю данных, обнаруженному им в записи:
- $0 — представляет всю строку текста (запись)
- $1 — первое поле в записи (строке)
- $2 — второе поле в записи (строке)
- и так далее
К переменной $n можно обратиться не только с помощью номера 0, 1, 2. Но и использовать переменную или выражение:
Поля выделяются из текста с использованием символа-разделителя. По умолчанию — это пробел или символ табуляции.
Если в качестве разделителя полей используется что-то, отличающееся от пробела или табуляции:
Использование нескольких команд
Awk позволяет обрабатывать данные с использованием многострочных скриптов. Чтобы передать awk многострочную команду, нужно разделить её части точкой с запятой:
Первая команда записывает новое значение в переменную $4 , а вторая выводит на экран всю строку.
Чтение скрипта awk из файла
Awk позволяет хранить скрипты в файлах и ссылаться на них, используя ключ -f . Подготовим файл user-home.awk , в который запишем следующее:
Вызовем awk, указав этот файл в качестве источника команд:
В файле скрипта может содержаться множество команд, при этом каждую из них достаточно записывать с новой строки, ставить после каждой точку с запятой не требуется:
Выполнение команд до начала обработки данных
Иногда нужно выполнить какие-то действия до того, как скрипт начнёт обработку записей из входного потока. Для этого можно воспользоваться ключевым словом BEGIN . Команды, которые следуют за BEGIN , будут исполнены до начала обработки данных.
Выполнение команд после окончания обработки данных
Ключевое слово END позволяет задавать команды, которые надо выполнить после окончания обработки данных:
Напишем скрипт следующего содержания и сохраним его в файле begin-end.awk :
Тут, в блоке BEGIN , создаётся заголовок табличного отчёта. В этом же разделе мы указываем символ-разделитель. После окончания обработки файла, благодаря блоку END , создается подвал отчета. Запустим скрипт:
Основные встроенные переменные
Кроме позиционных переменных $1 , $2 , $3 , которые позволяют извлекать значения полей, есть еще множество других. Вот некоторые из наиболее часто используемых:
- FIELDWIDTHS — разделённый пробелами список чисел, определяющий точную ширину каждого поля данных с учётом разделителей полей.
- FS — переменная, позволяющая задавать символ-разделитель полей.
- RS — переменная, позволяющая задавать символ-разделитель записей.
- OFS — разделитель полей на выводе awk-скрипта.
- ORS — разделитель записей на выводе awk-скрипта.
По умолчанию переменная OFS настроена на использование пробела. Её можно установить так, как нужно для целей вывода данных:
В некоторых случаях, вместо использования разделителя полей, данные в пределах записей расположены в колонках постоянной ширины. В подобных случаях необходимо задать переменную FIELDWIDTHS таким образом, чтобы её содержимое соответствовало особенностям представления данных.
При установленной переменной FIELDWIDTHS awk будет игнорировать переменную FS и находить поля данных в соответствии со сведениями об их ширине, заданными в FIELDWIDTHS .
Переменные RS и ORS задают порядок обработки записей. По умолчанию RS и ORS установлены на символ перевода строки. Это означает, что awk воспринимает каждую новую строку текста как новую запись и выводит каждую запись с новой строки.
Иногда случается так, что поля в потоке данных распределены по нескольким строкам:
Здесь в переменную FS мы записываем символ перевода строки. Это укажет awk на то, что каждая строка в потоке данных является отдельным полем. Кроме того, в переменную RS мы записываем пустую строку. Потому что в файле users.txt блоки данных о разных людях разделены пустой строкой. В результате awk будет считать пустые строки разделителями записей.
Дополнительные встроенные переменные
Помимо встроенных переменных, о которых мы уже говорили, существуют и другие:
- ARGC — количество аргументов командной строки.
- ARGV — массив с аргументами командной строки.
- ARGIND — индекс текущего обрабатываемого файла в массиве ARGV .
- ENVIRON — ассоциативный массив с переменными окружения и их значениями.
- ERRNO — код системной ошибки, которая может возникнуть при чтении или закрытии входных файлов.
- FILENAME — имя входного файла с данными.
- IGNORECASE — если эта переменная установлена в ненулевое значение, при обработке игнорируется регистр символов.
- FNR — номер текущей записи в файле данных.
- NF — общее число полей данных в текущей записи.
- NR — общее число обработанных записей.
Переменные ARGC и ARGV позволяют работать с аргументами командной строки. При этом скрипт, переданный awk, не попадает в массив аргументов ARGV :
Переменная ENVIRON представляет собой ассоциативный массив с переменными среды:
Переменные среды можно использовать и без обращения к ENVIRON :
Переменная NF позволяет обращаться к последнему полю данных в записи, не зная его точной позиции:
Эта переменная содержит числовой индекс последнего поля данных в записи. Обратиться к данному полю можно, поместив перед NF знак $ .
Переменные FNR и NR , хотя и могут показаться похожими, на самом деле различаются. Так, переменная FNR хранит число записей, обработанных в текущем файле. Переменная NR хранит общее число обработанных записей:
Каждая переменная или поле могут потенциально быть строкой или числом. Awk рассматривает переменную как строковую, пока не возникает необходимость выполнить операции сложения или конкатенации. Если к числу прибавляется строка, то строка автоматически преобразуется в число. Если к строке «прицепляется» число, то число преобразуется в строку.
Условный оператор if
Однострочный вариант оператора:
Если нужно выполнить в блоке if несколько операторов, их нужно заключить в фигурные скобки:
условный оператор if может содержать блок else :
Цикл while
Цикл while позволяет перебирать наборы данных, проверяя условие, которое остановит цикл.
В циклах while можно использовать команды break и continue . Первая позволяет досрочно завершить цикл и приступить к выполнению команд, расположенных после него. Вторая позволяет, не завершая до конца текущую итерацию, перейти к следующей.
Цикл for
Решим задачу расчёта среднего значения числовых полей с использованием цикла for :
Массивы
У awk есть ассоциативные массивы — в качестве индекса можно использовать строку или число. Нет необходимости заранее объявлять размер массива — массив может быть изменен во время выполнения.
Пример использования массива:
Удаление элемента массива:
Форматированный вывод данных
Команда printf позволяет выводить форматированные данные. Она даёт возможность настраивать внешний вид выводимых данных благодаря использованию шаблонов, в которых могут содержаться текстовые данные и спецификаторы форматирования.
Спецификатор форматирования — это специальный символ, который задаёт тип выводимых данных и то, как именно их нужно выводить. Awk использует спецификаторы форматирования как указатели мест вставки данных из переменных, передаваемых printf . Первый спецификатор соответствует первой переменной, второй спецификатор — второй, и так далее.
- %c — воспринимает переданное ему число как код ASCII-символа и выводит этот символ.
- %d — выводит десятичное целое число.
- %i — то же самое, что и d .
- %e — выводит число в экспоненциальной форме.
- %f — выводит число с плавающей запятой.
- %g — выводит число либо в экспоненциальной записи, либо в формате с плавающей запятой, в зависимости от того, как получается короче.
- %o — выводит восьмеричное представление числа.
- %s — выводит текстовую строку.
Встроенные функции
При работе с awk программисту доступны встроенные функции. В частности, это математические и строковые функции, функции для работы со временем.
Математические функции
- cos(x) — косинус x (x выражено в радианах).
- sin(x) — синус x (x выражено в радианах).
- exp(x) — экспоненциальная функция.
- int(x) — возвращает целую часть аргумента.
- log(x) — натуральный логарифм.
- rand() — возвращает случайное число с плавающей запятой в диапазоне от 0 до 1.
- sqrt(x) — квадратный корень из x.
Строковые функции
- length([arg]) — возвращает длину arg ; если arg не указан, то выдает длину текущей строки.
- match(string,pattern) — возвращает позицию вхождения шаблона pattern в строку string ; или 0 , если совпадение не найдено.
- index(string,needle) — возвращает начальную позицию вхождения подстроки needle в строку string ; если needle в string не содержится, возвращает 0 .
- split(string,array[,sep]) — помещает поля строки string в массив array и возвращает число заполненных элементов массива; если указан sep , то при анализе строки он понимается как разделитель.
- sub(replace,pattern[,string]) — заменяет в строке string первое вхождение шаблона pattern на строку replace ; в случае отсутствия аргумента string , применяется к текущей записи.
- gsub(replace,pattern[,string]) — аналогична sub() , но заменяет все вхождения.
- substr(string,start,length) — возвращает подстроку строки string , начиная с позиции start , длиной length символов.
- tolower() — перевод в нижний регистр.
- toupper() — перевод в верхний регистр.
Вот как пользоваться этими функциями:
Функция system
Функция system(«command») выполняет команду command и возвращает состояние выполненной команды.
Пользовательские функции
При необходимости можно создавать собственные функции awk. Для возвращения значения из функции можно использовать оператор return .
Шаблоны
В общем случае программа awk имеет вид:
Каждая запись поочерёдно сравнивается со всеми шаблонами , и каждый раз когда найдено соответствие, выполняется указанное действие . Если шаблон не указан, то действие выполняется для любой записи. Если не указано действие , то запись выводится. Специальные шаблоны BEGIN и END позволяют получить управление перед чтением первой входной строки и после прочтения последней входной строки, соответственно.
В предпоследнем примере $3
/903/ означает, что третье поле содержит строку 903 . В последнем примере $3 !
/903/ все наоборот — третье поле не должно содержать строку 903 .
В шаблонах можно использовать регулярные выражения:
Шаблоны в awk это не просто строка или регулярное выражение. Они могут быть произвольными комбинациями относительных выражений (больше, меньше, равно, не равно, …) и регулярных выражений с использованием ! , || , && и круглых скобок:
В случае использования относительных выражений < , <= , == , != , >= , > происходит сравнение чисел, если оба операнда — числа. В противном случае сравниваются строки.
Команда AWK в Linux с примерами
Awk — это язык сценариев общего назначения, предназначенный для расширенной обработки текста. В основном он используется как инструмент отчетности и анализа.
В отличие от большинства других процедурных языков программирования, awk управляется данными, что означает, что вы определяете набор действий, выполняемых с вводимым текстом. Он принимает входные данные, преобразует их и отправляет результат на стандартный вывод.
В этой статье рассматриваются основы языка программирования awk. Знание основ awk значительно улучшит вашу способность манипулировать текстовыми файлами в командной строке.
Как работает awk
Существует несколько различных реализаций awk. Мы будем использовать GNU-реализацию awk, которая называется gawk. В большинстве систем Linux интерпретатор awk — это просто символическая ссылка на gawk .
Записи и поля
Awk может обрабатывать текстовые файлы данных и потоки. Входные данные разделены на записи и поля. Awk работает с одной записью за раз, пока не будет достигнут конец ввода. Записи разделяются символом, который называется разделителем записей. Разделителем записей по умолчанию является символ новой строки, что означает, что каждая строка в текстовых данных является записью. Новый разделитель записей может быть установлен с помощью переменной RS .
Записи состоят из полей, разделенных разделителем полей. По умолчанию поля разделяются пробелом, включая один или несколько символов табуляции, пробела и новой строки.
Поля в каждой записи обозначаются знаком доллара ( $ ), за которым следует номер поля, начинающийся с 1. Первое поле представлено с помощью $1 , второе — с помощью $2 и так далее. На последнее поле также можно ссылаться с помощью специальной переменной $NF . На всю запись можно ссылаться с помощью $0 .
Вот визуальное представление, показывающее, как ссылаться на записи и поля:
Программа awk
Чтобы обработать текст с помощью awk , вы пишете программу, которая сообщает команде, что делать. Программа состоит из ряда правил и пользовательских функций. Каждое правило содержит одну пару шаблон и действие. Правила разделяются новой строкой или точкой с запятой ( ; ). Обычно awk-программа выглядит так:
Когда awk обрабатывает данные, если шаблон соответствует записи, он выполняет указанное действие с этой записью. Если у правила нет шаблона, все записи (строки) совпадают.
Действие awk заключено в фигурные скобки ( <> ) и состоит из операторов. Каждый оператор определяет операцию, которую нужно выполнить. В действии может быть несколько операторов, разделенных новой строкой или точкой с запятой ( ; ). Если правило не имеет действия, по умолчанию выполняется печать всей записи.
Awk поддерживает различные типы операторов, включая выражения, условные операторы, операторы ввода, вывода и т. Д. Наиболее распространенные операторы awk:
- exit — останавливает выполнение всей программы и выходит.
- next — останавливает обработку текущей записи и переходит к следующей записи во входных данных.
- print — Печать записей, полей, переменных и настраиваемого текста.
- printf — дает вам больше контроля над форматом вывода, аналогично C и bash printf .
При написании программ awk все, что находится после решетки (#) и до конца строки, считается комментарием. Длинные строки можно разбить на несколько строк с помощью символа продолжения, обратной косой черты ( ).
Выполнение программ awk
Программа awk может быть запущена несколькими способами. Если программа короткая и простая, ее можно передать непосредственно интерпретатору awk из командной строки:
При запуске программы в командной строке ее следует заключать в одинарные кавычки ( '' ), чтобы оболочка не интерпретировала программу.
Если программа большая и сложная, лучше всего поместить ее в файл и использовать параметр -f для передачи файла команде awk :
В приведенных ниже примерах мы будем использовать файл с именем «team.txt», который выглядит примерно так:
Шаблоны AWK
Шаблоны в awk определяют, следует ли выполнять соответствующее действие.
Awk поддерживает различные типы шаблонов, включая регулярное выражение, выражение отношения, диапазон и шаблоны специальных выражений.
Если у правила нет шаблона, сопоставляется каждая входная запись. Вот пример правила, содержащего только действие:
Программа распечатает третье поле каждой записи:
Шаблоны регулярных выражений
Регулярное выражение или регулярное выражение — это шаблон, который соответствует набору строк. Шаблоны регулярных выражений AWK заключаются в косую черту ( // ):
Самый простой пример — это буквальное сопоставление символа или строки. Например, чтобы отобразить первое поле каждой записи, содержащее «0,5», вы должны выполнить следующую команду:
Шаблон может быть любым типом расширенного регулярного выражения. Вот пример, который печатает первое поле, если запись начинается с двух или более цифр:
Шаблоны реляционных выражений
Шаблоны реляционных выражений обычно используются для сопоставления содержимого определенного поля или переменной.
По умолчанию шаблоны регулярных выражений сопоставляются с записями. Чтобы сопоставить регулярное выражение с полем, укажите поле и используйте оператор сравнения «содержать» (
Например, чтобы напечатать первое поле каждой записи, второе поле которой содержит «ia», вы должны ввести:
Чтобы сопоставить поля, которые не содержат заданного шаблона, используйте оператор !
Вы можете сравнивать строки или числа для таких отношений, как, больше, меньше, равно и т. Д. Следующая команда печатает первое поле всех записей, третье поле которых больше 50:
Шаблоны диапазонов
Шаблоны диапазонов состоят из двух шаблонов, разделенных запятой:
Все записи, начинающиеся с записи, соответствующей первому шаблону, до совпадения с записью, соответствующей второму шаблону.
Вот пример, который напечатает первое поле всех записей, начиная с записи, включая «Raptors», до записи, включающей «Celtics»:
Шаблоны также могут быть выражениями отношений. Приведенная ниже команда распечатает все записи, начиная с той, четвертое поле которой равно 32, до той, четвертое поле которой равно 33:
Шаблоны диапазона нельзя комбинировать с другими выражениями шаблона.
Специальные шаблоны выражения
Awk включает следующие специальные паттерны:
- BEGIN — используется для выполнения действий перед обработкой записей.
- END — используется для выполнения действий после обработки записей.
Шаблон BEGIN обычно используется для установки переменных, а шаблон END для обработки данных из записей, таких как вычисления.
В следующем примере печатается «Начать обработку.», Затем печатается третье поле каждой записи и, наконец, «Завершить обработку».
Если программа имеет только шаблон BEGIN , действия выполняются, а ввод не обрабатывается. Если в программе есть только шаблон END , ввод обрабатывается перед выполнением действий правила.
Версия awk для Gnu также включает еще два специальных шаблона BEGINFILE и ENDFILE , которые позволяют выполнять действия при обработке файлов.
Комбинирование узоров
Awk позволяет комбинировать два или более шаблонов, используя логический оператор И ( && ) и логический оператор ИЛИ ( || ).
Вот пример, в котором оператор && используется для печати первого поля той записи, у которой третье поле больше 50, а четвертое поле меньше 30:
Встроенные переменные
Awk имеет ряд встроенных переменных, которые содержат полезную информацию и позволяют управлять обработкой программы. Ниже приведены некоторые из наиболее распространенных встроенных переменных:
- NF — количество полей в записи.
- NR — номер текущей записи.
- FILENAME — имя входного файла, который в данный момент обрабатывается.
- FS — Разделитель полей.
- RS — Разделитель записей.
- OFS — Разделитель выходных полей.
- ORS — разделитель выходной записи.
Вот пример, показывающий, как напечатать имя файла и количество строк (записей):
Переменные в AWK могут быть установлены в любой строке программы. Чтобы определить переменную для всей программы, поместите ее в шаблон BEGIN .
Изменение поля и разделителя записей
По умолчанию значение разделителя полей — любое количество пробелов или символов табуляции. Его можно изменить, установив в переменной FS .
Например, чтобы установить разделитель полей . вы бы использовали:
Разделитель полей также может содержать более одного символа:
При запуске однострочных команд awk в командной строке вы также можете использовать параметр -F для изменения разделителя полей:
По умолчанию разделителем записей является символ новой строки, который можно изменить с помощью переменной RS .
Вот пример, показывающий, как изменить разделитель записей на . :
Действия при отсутствии нагрузки
Действия awk заключаются в фигурные скобки ( <> ) и выполняются при совпадении с шаблоном. Действие может иметь ноль или более утверждений. Несколько операторов выполняются в том порядке, в котором они появляются, и должны быть разделены новой строкой или точкой с запятой ( ; ).
В awk поддерживается несколько типов операторов действий:
- Выражения, такие как присваивание переменных, арифметические операторы, операторы увеличения и уменьшения.
- Управляющие операторы, используемые для управления потоком программы ( if , for , while , switch и т. Д.)
- Операторы вывода, такие как print и printf .
- Составные утверждения, чтобы сгруппировать другие утверждения.
- Операторы ввода, чтобы управлять обработкой ввода.
- Операторы удаления для удаления элементов массива.
Оператор print вероятно, является наиболее часто используемым оператором awk. Он печатает форматированный вывод текста, записей, полей и переменных.
При печати нескольких элементов их нужно разделять запятыми. Вот пример:
Печатные материалы разделяются одиночными пробелами:
Если вы не используете запятые, между элементами не будет пробелов:
Печатные элементы объединены:
Когда print используется без аргументов, по умолчанию используется print $0 . Текущая запись будет напечатана.
Чтобы напечатать собственный текст, вы должны заключить текст в двойные кавычки:
Вы также можете печатать специальные символы, такие как новая строка:
Оператор printf дает вам больше контроля над форматом вывода. Вот пример вставки номеров строк:
printf не создает новую строку после каждой записи, поэтому мы используем n :
Следующая команда вычисляет сумму значений, хранящихся в третьем поле в каждой строке:
Вот еще один пример, показывающий, как использовать выражения и управляющие операторы для печати квадратов чисел от 1 до 5:
Однострочные команды, подобные приведенной выше, труднее понять и поддерживать. При написании более длинных программ следует создать отдельный программный файл:
Запустите программу, передав имя файла интерпретатору awk :
Вы также можете запустить программу awk как исполняемый файл, используя директиву shebang и установив интерпретатор awk :
Теперь вы можете запустить программу, введя:
Использование переменных оболочки в программах AWK
Если вы используете команду awk в сценариях оболочки, велика вероятность, что вам потребуется передать переменную оболочки программе awk. Один из вариантов — заключить программу в двойные вместо одинарных кавычек и подставить переменную в программе. Однако эта опция сделает вашу awk-программу более сложной, так как вам нужно будет избежать переменных awk.
Рекомендуемый способ использования переменных оболочки в программах awk — присвоить переменную оболочки переменной awk. Вот пример:
Выводы
Awk — один из самых мощных инструментов для работы с текстом.
Эта статья едва затрагивает поверхность языка программирования awk. Чтобы узнать больше об awk, ознакомьтесь с официальной документацией Gawk .
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.
Bash-скрипты, часть 8: язык обработки данных awk
В прошлый раз мы говорили о потоковом редакторе sed и рассмотрели немало примеров обработки текста с его помощью. Sed способен решать многие задачи, но есть у него и ограничения. Иногда нужен более совершенный инструмент для обработки данных, нечто вроде языка программирования. Собственно говоря, такой инструмент — awk.
Утилита awk, или точнее GNU awk, в сравнении с sed, выводит обработку потоков данных на более высокий уровень. Благодаря awk в нашем распоряжении оказывается язык программирования, а не довольно скромный набор команд, отдаваемых редактору. С помощью языка программирования awk можно выполнять следующие действия:
- Объявлять переменные для хранения данных.
- Использовать арифметические и строковые операторы для работы с данными.
- Использовать структурные элементы и управляющие конструкции языка, такие, как оператор if-then и циклы, что позволяет реализовать сложные алгоритмы обработки данных.
- Создавать форматированные отчёты.
Особенности вызова awk
Схема вызова awk выглядит так:
Awk воспринимает поступающие к нему данные в виде набора записей. Записи представляют собой наборы полей. Упрощенно, если не учитывать возможности настройки awk и говорить о некоем вполне обычном тексте, строки которого разделены символами перевода строки, запись — это строка. Поле — это слово в строке.
Рассмотрим наиболее часто используемые ключи командной строки awk:
Настоящая мощь awk скрывается в той части команды его вызова, которая помечена выше как program . Она указывает на файл awk-скрипта, написанный программистом и предназначенный для чтения данных, их обработки и вывода результатов.
Чтение awk-скриптов из командной строки
Скрипты awk, которые можно писать прямо в командной строке, оформляются в виде текстов команд, заключённых в фигурные скобки. Кроме того, так как awk предполагает, что скрипт представляет собой текстовую строку, его нужно заключить в одинарные кавычки:
Запустим эту команду… И ничего не произойдёт Дело тут в том, что мы, при вызове awk, не указали файл с данными. В подобной ситуации awk ожидает поступления данных из STDIN. Поэтому выполнение такой команды не приводит к немедленно наблюдаемым эффектам, но это не значит, что awk не работает — он ждёт входных данных из STDIN .
Если теперь ввести что-нибудь в консоль и нажать Enter , awk обработает введённые данные с помощью скрипта, заданного при его запуске. Awk обрабатывает текст из потока ввода построчно, этим он похож на sed. В нашем случае awk ничего не делает с данными, он лишь, в ответ на каждую новую полученную им строку, выводит на экран текст, заданный в команде print .
Первый запуск awk, вывод на экран заданного текста
Что бы мы ни ввели, результат в данном случае будет одним и тем же — вывод текста.
Для того, чтобы завершить работу awk, нужно передать ему символ конца файла (EOF, End-of-File). Сделать это можно, воспользовавшись сочетанием клавиш CTRL + D .
Неудивительно, если этот первый пример показался вам не особо впечатляющим. Однако, самое интересное — впереди.
Позиционные переменные, хранящие данные полей
Одна из основных функций awk заключается в возможности манипулировать данными в текстовых файлах. Делается это путём автоматического назначения переменной каждому элементу в строке. По умолчанию awk назначает следующие переменные каждому полю данных, обнаруженному им в записи:
- $0 — представляет всю строку текста (запись).
- $1 — первое поле.
- $2 — второе поле.
- $n — n-ное поле.
Рассмотрим использование этих переменных на простом примере. А именно, обработаем файл, в котором содержится несколько строк (этот файл показан на рисунке ниже) с помощью такой команды:
Вывод в консоль первого поля каждой строки
Здесь использована переменная $1 , которая позволяет получить доступ к первому полю каждой строки и вывести его на экран.
Иногда в некоторых файлах в качестве разделителей полей используется что-то, отличающееся от пробелов или символов табуляции. Выше мы упоминали ключ awk -F , который позволяет задать необходимый для обработки конкретного файла разделитель:
Указание символа-разделителя при вызове awk
Эта команда выводит первые элементы строк, содержащихся в файле /etc/passwd . Так как в этом файле в качестве разделителей используются двоеточия, именно этот символ был передан awk после ключа -F .
Использование нескольких команд
Вызов awk с одной командой обработки текста — подход очень ограниченный. Awk позволяет обрабатывать данные с использованием многострочных скриптов. Для того, чтобы передать awk многострочную команду при вызове его из консоли, нужно разделить её части точкой с запятой:
Вызов awk из командной строки с передачей ему многострочного скрипта
В данном примере первая команда записывает новое значение в переменную $4 , а вторая выводит на экран всю строку.
Чтение скрипта awk из файла
Awk позволяет хранить скрипты в файлах и ссылаться на них, используя ключ -f . Подготовим файл testfile , в который запишем следующее:
Вызовем awk, указав этот файл в качестве источника команд:
Вызов awk с указанием файла скрипта
Тут мы выводим из файла /etc/passwd имена пользователей, которые попадают в переменную $1 , и их домашние директории, которые попадают в $6 . Обратите внимание на то, что файл скрипта задают с помощью ключа -f , а разделитель полей, двоеточие в нашем случае, с помощью ключа -F .
В файле скрипта может содержаться множество команд, при этом каждую из них достаточно записывать с новой строки, ставить после каждой точку с запятой не требуется.
Вот как это может выглядеть:
Тут мы храним текст, используемый при выводе данных, полученных из каждой строки обрабатываемого файла, в переменной, и используем эту переменную в команде print . Если воспроизвести предыдущий пример, записав этот код в файл testfile , выведено будет то же самое.
Выполнение команд до начала обработки данных
Иногда нужно выполнить какие-то действия до того, как скрипт начнёт обработку записей из входного потока. Например — создать шапку отчёта или что-то подобное.
Для этого можно воспользоваться ключевым словом BEGIN . Команды, которые следуют за BEGIN , будут исполнены до начала обработки данных. В простейшем виде это выглядит так:
А вот — немного более сложный пример:
Выполнение команд до начала обработки данных
Сначала awk исполняет блок BEGIN , после чего выполняется обработка данных. Будьте внимательны с одинарными кавычками, используя подобные конструкции в командной строке. Обратите внимание на то, что и блок BEGIN , и команды обработки потока, являются в представлении awk одной строкой. Первая одинарная кавычка, ограничивающая эту строку, стоит перед BEGIN . Вторая — после закрывающей фигурной скобки команды обработки данных.
Выполнение команд после окончания обработки данных
Ключевое слово END позволяет задавать команды, которые надо выполнить после окончания обработки данных:
Результаты работы скрипта, в котором имеются блоки BEGIN и END
После завершения вывода содержимого файла, awk выполняет команды блока END . Это полезная возможность, с её помощью, например, можно сформировать подвал отчёта. Теперь напишем скрипт следующего содержания и сохраним его в файле myscript :
Тут, в блоке BEGIN , создаётся заголовок табличного отчёта. В этом же разделе мы указываем символ-разделитель. После окончания обработки файла, благодаря блоку END , система сообщит нам о том, что работа окончена.
Обработка файла /etc/passwd с помощью awk-скрипта
Всё, о чём мы говорили выше — лишь малая часть возможностей awk. Продолжим освоение этого полезного инструмента.
Встроенные переменные: настройка процесса обработки данных
Утилита awk использует встроенные переменные, которые позволяют настраивать процесс обработки данных и дают доступ как к обрабатываемым данным, так и к некоторым сведениям о них.
Мы уже рассматривали позиционные переменные — $1 , $2 , $3 , которые позволяют извлекать значения полей, работали мы и с некоторыми другими переменными. На самом деле, их довольно много. Вот некоторые из наиболее часто используемых:
По умолчанию переменная OFS настроена на использование пробела. Её можно установить так, как нужно для целей вывода данных:
Установка разделителя полей выходного потока
Переменная FIELDWIDTHS позволяет читать записи без использования символа-разделителя полей.
В некоторых случаях, вместо использования разделителя полей, данные в пределах записей расположены в колонках постоянной ширины. В подобных случаях необходимо задать переменную FIELDWIDTHS таким образом, чтобы её содержимое соответствовало особенностям представления данных.
При установленной переменной FIELDWIDTHS awk будет игнорировать переменную FS и находить поля данных в соответствии со сведениями об их ширине, заданными в FIELDWIDTHS .
Предположим, имеется файл testfile , содержащий такие данные:
Известно, что внутренняя организация этих данных соответствует шаблону 3-5-2-5, то есть, первое поле имеет ширину 3 символа, второе — 5, и так далее. Вот скрипт, который позволит разобрать такие записи:
Использование переменной FIELDWIDTHS
Посмотрим на то, что выведет скрипт. Данные разобраны с учётом значения переменной FIELDWIDTHS , в результате числа и другие символы в строках разбиты в соответствии с заданной шириной полей.
Переменные RS и ORS задают порядок обработки записей. По умолчанию RS и ORS установлены на символ перевода строки. Это означает, что awk воспринимает каждую новую строку текста как новую запись и выводит каждую запись с новой строки.
Иногда случается так, что поля в потоке данных распределены по нескольким строкам. Например, пусть имеется такой файл с именем addresses :
Если попытаться прочесть эти данные при условии, что FS и RS установлены в значения по умолчанию, awk сочтёт каждую новую строку отдельной записью и выделит поля, опираясь на пробелы. Это не то, что нам в данном случае нужно.
Для того, чтобы решить эту проблему, в FS надо записать символ перевода строки. Это укажет awk на то, что каждая строка в потоке данных является отдельным полем.
Кроме того, в данном примере понадобится записать в переменную RS пустую строку. Обратите внимание на то, что в файле блоки данных о разных людях разделены пустой строкой. В результате awk будет считать пустые строки разделителями записей. Вот как всё это сделать:
Результаты настройки переменных RS и FS
Как видите, awk, благодаря таким настройкам переменных, воспринимает строки из файла как поля, а разделителями записей становятся пустые строки.
Встроенные переменные: сведения о данных и об окружении
Переменные ARGC и ARGV позволяют работать с аргументами командной строки. При этом скрипт, переданный awk, не попадает в массив аргументов ARGV . Напишем такой скрипт:
После его запуска можно узнать, что общее число аргументов командной строки — 2, а под индексом 1 в массиве ARGV записано имя обрабатываемого файла. В элементе массива с индексом 0 в данном случае будет «awk».
Работа с параметрами командной строки
Переменная ENVIRON представляет собой ассоциативный массив с переменными среды. Опробуем её:
Работа с переменными среды
Переменные среды можно использовать и без обращения к ENVIRON . Сделать это, например, можно так:
Работа с переменными среды без использования ENVIRON
Переменная NF позволяет обращаться к последнему полю данных в записи, не зная его точной позиции:
Пример использования переменной NF
Эта переменная содержит числовой индекс последнего поля данных в записи. Обратиться к данному полю можно, поместив перед NF знак $ .
Переменные FNR и NR , хотя и могут показаться похожими, на самом деле различаются. Так, переменная FNR хранит число записей, обработанных в текущем файле. Переменная NR хранит общее число обработанных записей. Рассмотрим пару примеров, передав awk один и тот же файл дважды:
Различие переменных NR и FNR
Как видно, FNR , как и в предыдущем примере, сбрасывается в начале обработки каждого файла, а вот NR , при переходе к следующему файлу, сохраняет значение.
Пользовательские переменные
Как и любые другие языки программирования, awk позволяет программисту объявлять переменные. Имена переменных могут включать в себя буквы, цифры, символы подчёркивания. Однако, они не могут начинаться с цифры. Объявить переменную, присвоить ей значение и воспользоваться ей в коде можно так:
Работа с пользовательской переменной
Условный оператор
Awk поддерживает стандартный во многих языках программирования формат условного оператора if-then-else . Однострочный вариант оператора представляет собой ключевое слово if , за которым, в скобках, записывают проверяемое выражение, а затем — команду, которую нужно выполнить, если выражение истинно.
Например, есть такой файл с именем testfile :
Напишем скрипт, который выводит числа из этого файла, большие 20:
Однострочный оператор if
Если нужно выполнить в блоке if несколько операторов, их нужно заключить в фигурные скобки:
Выполнение нескольких команд в блоке if
Как уже было сказано, условный оператор awk может содержать блок else :
Условный оператор с блоком else
Ветвь else может быть частью однострочной записи условного оператора, включая в себя лишь одну строку с командой. В подобном случае после ветви if , сразу перед else , надо поставить точку с запятой:
Условный оператор, содержащий ветви if и else, записанный в одну строку
Цикл while
Цикл while позволяет перебирать наборы данных, проверяя условие, которое остановит цикл.
Вот файл myfile , обработку которого мы хотим организовать с помощью цикла:
Напишем такой скрипт:
Обработка данных в цикле while
Цикл while перебирает поля каждой записи, накапливая их сумму в переменной total и увеличивая в каждой итерации на 1 переменную-счётчик i . Когда i достигнет 4, условие на входе в цикл окажется ложным и цикл завершится, после чего будут выполнены остальные команды — подсчёт среднего значения для числовых полей текущей записи и вывод найденного значения.
В циклах while можно использовать команды break и continue . Первая позволяет досрочно завершить цикл и приступить к выполнению команд, расположенных после него. Вторая позволяет, не завершая до конца текущую итерацию, перейти к следующей.
Вот как работает команда break :
Команда break в цикле while
Цикл for
Циклы for используются во множестве языков программировании. Поддерживает их и awk. Решим задачу расчёта среднего значения числовых полей с использованием такого цикла:
Начальное значение переменной-счётчика и правило её изменения в каждой итерации, а также условие прекращения цикла, задаются в начале цикла, в круглых скобках. В итоге нам не нужно, в отличие от случая с циклом while , самостоятельно инкрементировать счётчик.
Форматированный вывод данных
Команда printf в awk позволяет выводить форматированные данные. Она даёт возможность настраивать внешний вид выводимых данных благодаря использованию шаблонов, в которых могут содержаться текстовые данные и спецификаторы форматирования.
Спецификатор форматирования — это специальный символ, который задаёт тип выводимых данных и то, как именно их нужно выводить. Awk использует спецификаторы форматирования как указатели мест вставки данных из переменных, передаваемых printf .
Первый спецификатор соответствует первой переменной, второй спецификатор — второй, и так далее.
Спецификаторы форматирования записывают в таком виде:
Вот некоторые из них:
Вот как форматировать выводимые данные с помощью printf :
Форматирование выходных данных с помощью printf
Тут, в качестве примера, мы выводим число в экспоненциальной записи. Полагаем, этого достаточно для того, чтобы вы поняли основную идею, на которой построена работа с printf .
Встроенные математические функции
Вот как пользоваться этими функциями:
Работа с математическими функциями
Строковые функции
Awk поддерживает множество строковых функций. Все они устроены более или менее одинаково. Вот, например, функция toupper :
Использование строковой функции toupper
Эта функция преобразует символы, хранящиеся в переданной ей строковой переменной, к верхнему регистру.
Пользовательские функции
При необходимости вы можете создавать собственные функции awk. Такие функции можно использовать так же, как встроенные:
Использование собственной функции
В примере используется заданная нами функция myprint , которая выводит данные.
Итоги
Сегодня мы разобрали основы awk. Это мощнейший инструмент обработки данных, масштабы которого сопоставимы с отдельным языком программирования.
Вы не могли не заметить, что многое из того, о чём мы говорим, не так уж и сложно для понимания, а зная основы, уже можно что-то автоматизировать, но если копнуть поглубже, вникнуть в документацию… Вот, например, The GNU Awk User’s Guide. В этом руководстве впечатляет уже одно то, что оно ведёт свою историю с 1989-го (первая версия awk, кстати, появилась в 1977-м). Однако, сейчас вы знаете об awk достаточно для того, чтобы не потеряться в официальной документации и познакомиться с ним настолько близко, насколько вам того хочется. В следующий раз, кстати, мы поговорим о регулярных выражениях. Без них невозможно заниматься серьёзной обработкой текстов в bash-скриптах с применением sed и awk.
Уважаемые читатели! Уверены, многие из вас периодически пользуются awk. Расскажите, как он помогает вам в работе?
AWK – Обзор
AWK – это интерпретируемый язык программирования. Это очень мощный и специально разработанный для обработки текста. Его название происходит от фамилий его авторов – Альфред Ахо, Питер Вайнбергер и Брайан Керниган.
Версия AWK, которую распространяет GNU / Linux, написана и поддерживается Free Software Foundation (FSF); его часто называют GNU AWK.
Типы AWK
Ниже приведены варианты AWK –
AWK – Оригинальный AWK от AT & T Laboratory.
NAWK – более новая и улучшенная версия AWK от AT & T Laboratory.
GAWK – это GNU AWK. Все дистрибутивы GNU / Linux поставляются с GAWK. Он полностью совместим с AWK и NAWK.
AWK – Оригинальный AWK от AT & T Laboratory.
NAWK – более новая и улучшенная версия AWK от AT & T Laboratory.
GAWK – это GNU AWK. Все дистрибутивы GNU / Linux поставляются с GAWK. Он полностью совместим с AWK и NAWK.
Типичное использование AWK
Множество задач можно выполнить с помощью AWK. Ниже перечислены лишь некоторые из них –
- Обработка текста,
- Создание отформатированных текстовых отчетов,
- Выполнение арифметических операций,
- Выполнение строковых операций и многое другое.
AWK – Окружающая среда
В этой главе описывается, как настроить среду AWK в вашей системе GNU / Linux.
Установка с помощью диспетчера пакетов
Как правило, AWK доступен по умолчанию в большинстве дистрибутивов GNU / Linux. Вы можете использовать какую команду, чтобы проверить, присутствует ли она в вашей системе или нет. Если у вас нет AWK, установите его в GNU / Linux на основе Debian с помощью менеджера пакетов Advance Package Tool (APT) следующим образом:
Точно так же, чтобы установить AWK в GNU / Linux на основе RPM, используйте менеджер пакетов Yellowdog Updator Modifier yum следующим образом:
После установки убедитесь, что AWK доступен через командную строку.
Выполнив приведенный выше код, вы получите следующий результат –
Установка из исходного кода
Поскольку GNU AWK является частью проекта GNU, его исходный код доступен для бесплатной загрузки. Мы уже видели, как установить AWK с помощью менеджера пакетов. Давайте теперь поймем, как установить AWK из его исходного кода.
Следующая установка применима к любому программному обеспечению GNU / Linux, а также к большинству других свободно доступных программ. Вот шаги установки –
Шаг 1 – Загрузите исходный код из аутентичного места. Утилита командной строки wget служит для этой цели.
Шаг 2 – Распакуйте и извлеките загруженный исходный код.
Шаг 3 – Перейдите в каталог и запустите configure.
Шаг 4 – После успешного завершения конфигурирование генерирует Makefile. Чтобы скомпилировать исходный код, введите команду make .
Шаг 5 – Вы можете запустить набор тестов, чтобы убедиться, что сборка чистая. Это необязательный шаг.
Шаг 6 – Наконец, установите AWK. Убедитесь, что у вас есть привилегии суперпользователя.
Вот и все! Вы успешно скомпилировали и установили AWK. Проверьте это, выполнив команду awk следующим образом:
Выполнив этот код, вы получите следующий результат –
AWK – рабочий процесс
Чтобы стать опытным программистом на AWK, вам необходимо знать его внутреннее устройство. AWK следует простому рабочему процессу – чтение, выполнение и повторение. Следующая диаграмма изображает рабочий процесс AWK –
Читать
AWK читает строку из входного потока (файл, канал или стандартный ввод) и сохраняет ее в памяти.
казнить
Все команды AWK применяются последовательно на входе. По умолчанию AWK выполняет команды в каждой строке. Мы можем ограничить это, предоставляя шаблоны.
Повторение
Этот процесс повторяется, пока файл не достигнет своего конца.
Структура программы
Давайте теперь разберемся со структурой программы AWK.
НАЧАЛО блока
Синтаксис блока BEGIN следующий:
Блок BEGIN выполняется при запуске программы. Это выполняется только один раз. Это хорошее место для инициализации переменных. BEGIN – это ключевое слово AWK, поэтому оно должно быть в верхнем регистре. Обратите внимание, что этот блок не является обязательным.
Блок кузова
Синтаксис блока тела выглядит следующим образом:
Блок body применяет команды AWK к каждой строке ввода. По умолчанию AWK выполняет команды в каждой строке. Мы можем ограничить это, предоставляя шаблоны. Обратите внимание, что для блока Body нет ключевых слов.
END Block
Синтаксис блока END следующий:
Блок END выполняется в конце программы. END – это ключевое слово AWK, поэтому оно должно быть в верхнем регистре. Обратите внимание, что этот блок не является обязательным.
Давайте создадим файл marks.txt, который содержит серийный номер, имя учащегося, имя субъекта и количество полученных оценок.
Давайте теперь отобразим содержимое файла с заголовком, используя скрипт AWK.
Когда этот код выполняется, он дает следующий результат –
В начале AWK печатает заголовок из блока BEGIN. Затем в блоке body он читает строку из файла и выполняет команду печати AWK, которая просто печатает содержимое в стандартном потоке вывода. Этот процесс повторяется, пока файл не достигнет конца.
AWK – основной синтаксис
AWK прост в использовании. Мы можем предоставить команды AWK либо непосредственно из командной строки, либо в виде текстового файла, содержащего команды AWK.
Командная строка AWK
Мы можем указать команду AWK в одинарных кавычках в командной строке, как показано ниже:
пример
Рассмотрим текстовый файл marks.txt со следующим содержанием –
Давайте отобразим полное содержимое файла, используя AWK, следующим образом:
Выполнив этот код, вы получите следующий результат –
Файл программы AWK
Мы можем предоставить команды AWK в файле сценария, как показано ниже:
Сначала создайте текстовый файл command.awk, содержащий команду AWK, как показано ниже –
Теперь мы можем дать команду AWK прочитать команды из текстового файла и выполнить действие. Здесь мы достигаем того же результата, что и в приведенном выше примере.
Выполнив этот код, вы получите следующий результат –
AWK Стандартные Опции
AWK поддерживает следующие стандартные параметры, которые могут быть предоставлены из командной строки.
Опция -v
Эта опция присваивает значение переменной. Это позволяет присваивать перед выполнением программы. В следующем примере описано использование параметра -v.
Выполнив этот код, вы получите следующий результат –
Опция –dump-variable [= file]
Он печатает отсортированный список глобальных переменных и их окончательных значений в файл. Файл по умолчанию – awkvars.out .
Выполнив приведенный выше код, вы получите следующий результат –
Опция –help
Эта опция выводит справочное сообщение на стандартный вывод.
Выполнив этот код, вы получите следующий результат –
Опция –lint [= fatal]
Эта опция позволяет проверять непереносимые или сомнительные конструкции. Когда указан фатальный аргумент, предупреждающие сообщения рассматриваются как ошибки. Следующий пример демонстрирует это –
Выполнив этот код, вы получите следующий результат –
Опция –posix
Эта опция включает строгую совместимость с POSIX, в которой отключены все общие и специфичные для gawk расширения.
Опция –profile [= file]
Эта опция генерирует печатную версию программы в файле. Файл по умолчанию – awkprof.out . Ниже простой пример иллюстрирует это –
Выполнив этот код, вы получите следующий результат –
Опция –traditional
Эта опция отключает все специфичные для gawk расширения.
Опция –version
Эта опция отображает информацию о версии программы AWK.
Когда этот код выполняется, он дает следующий результат –
AWK – Основные примеры
Эта глава описывает несколько полезных команд AWK и их соответствующие примеры. Рассмотрим текстовый файл marks.txt для обработки со следующим содержимым:
Печать столбца или поля
Вы можете настроить AWK на печать только определенных столбцов из поля ввода. Следующий пример демонстрирует это –
пример
Выполнив этот код, вы получите следующий результат –
Выход
В файле marks.txt третий столбец содержит имя субъекта, а четвертый столбец содержит оценки, полученные по конкретному предмету. Давайте распечатаем эти два столбца с помощью команды печати AWK. В приведенном выше примере $ 3 и $ 4 представляют третье и четвертое поля соответственно из входной записи.
Печать всех строк
По умолчанию AWK печатает все строки, которые соответствуют шаблону.
пример
Выполнив этот код, вы получите следующий результат –
Выход
В приведенном выше примере мы ищем шаблон формы a . Когда сопоставление с образцом завершается успешно, он выполняет команду из блока body. При отсутствии блока тела – выполняется действие по умолчанию, которое заключается в печати записи. Следовательно, следующая команда дает тот же результат –
пример
Печать столбцов по шаблону
Когда совпадение с образцом завершается успешно, AWK печатает всю запись по умолчанию. Но вы можете настроить AWK на печать только определенных полей. Например, следующий пример печатает третье и четвертое поле, когда совпадение с образцом завершается успешно.
пример
Выполнив этот код, вы получите следующий результат –
Выход
Печать колонки в любом порядке
Вы можете печатать столбцы в любом порядке. Например, в следующем примере печатается четвертый столбец, за которым следует третий столбец.
пример
Выполнив приведенный выше код, вы получите следующий результат –
Выход
Подсчет и печать совмещенного рисунка
Давайте посмотрим пример, где вы можете посчитать и напечатать количество строк, для которых совпадение с образцом прошло успешно.
пример
Выполнив этот код, вы получите следующий результат –
Выход
В этом примере мы увеличиваем значение счетчика при успешном совпадении с шаблоном и печатаем это значение в блоке END. Обратите внимание, что в отличие от других языков программирования, нет необходимости объявлять переменную перед ее использованием.
Печать строк с более чем 18 символами
Давайте печатать только те строки, которые содержат более 18 символов.
пример
Выполнив этот код, вы получите следующий результат –
Выход
AWK предоставляет встроенную функцию длины, которая возвращает длину строки. Переменная $ 0 хранит всю строку, и при отсутствии блока тела выполняется действие по умолчанию, то есть действие печати. Следовательно, если строка содержит более 18 символов, то результаты сравнения верны, и строка печатается.
AWK – встроенные переменные
AWK предоставляет несколько встроенных переменных. Они играют важную роль при написании сценариев AWK. Эта глава демонстрирует использование встроенных переменных.
Стандартные переменные AWK
Стандартные переменные AWK обсуждаются ниже.
Это подразумевает количество аргументов, представленных в командной строке.
Выполнив этот код, вы получите следующий результат –
Но почему AWK показывает 5, когда вы передали только 4 аргумента? Просто проверьте следующий пример, чтобы очистить ваши сомнения.
Это массив, в котором хранятся аргументы командной строки. Допустимый индекс массива – от 0 до ARGC-1.
Выполнив этот код, вы получите следующий результат –
CONVFMT
Он представляет формат преобразования для чисел. Его значение по умолчанию % .6g .
ЭНВАЙРОН
Это ассоциативный массив переменных среды.
Выполнив этот код, вы получите следующий результат –
Чтобы найти имена других переменных среды, используйте команду env .
ИМЯ ФАЙЛА
Он представляет текущее имя файла.
Выполнив этот код, вы получите следующий результат –
Обратите внимание, что FILENAME не определен в блоке BEGIN.
Он представляет собой (входной) разделитель полей, и его значением по умолчанию является пробел. Вы также можете изменить это, используя параметр командной строки -F .
Выполнив этот код, вы получите следующий результат –
Он представляет количество полей в текущей записи. Например, в следующем примере печатаются только те строки, которые содержат более двух полей.
Выполнив этот код, вы получите следующий результат –
Он представляет номер текущей записи. Например, следующий пример печатает запись, если номер текущей записи меньше трех.
Выполнив этот код, вы получите следующий результат –
Это похоже на NR, но относительно текущего файла. Это полезно, когда AWK работает с несколькими файлами. Значение FNR сбрасывается с новым файлом.
Он представляет номер выходного формата, и его значением по умолчанию является % .6g .
Он представляет разделитель выходного поля, и его значением по умолчанию является пробел.
Выполнив этот код, вы получите следующий результат –
Он представляет разделитель выходных записей, и его значением по умолчанию является перевод строки.
Выполнив приведенный выше код, вы получите следующий результат –
RLENGTH
Он представляет длину строки, сопоставленной функцией соответствия. Функция соответствия AWK ищет данную строку во входной строке.
Выполнив этот код, вы получите следующий результат –
Он представляет (входной) разделитель записей, и его значением по умолчанию является перевод строки.
Выполнив этот код, вы получите следующий результат –
RSTART
Он представляет первую позицию в строке, сопоставленной функцией соответствия.
Выполнив этот код, вы получите следующий результат –
SUBSEP
Он представляет символ разделителя для индексов массива, и его значение по умолчанию равно \ 034 .
Выполнив этот код, вы получите следующий результат –
Он представляет всю входную запись.
Выполнив этот код, вы получите следующий результат –
Он представляет n- е поле в текущей записи, где поля разделены символом FS.
Выполнив этот код, вы получите следующий результат –
GNU AWK Конкретные переменные
GNU AWK конкретные переменные являются следующими –
ARGIND
Он представляет индекс в ARGV текущего обрабатываемого файла.
Выполнив этот код, вы получите следующий результат –
BINMODE
Он используется для указания двоичного режима для всех файловых операций ввода-вывода в системах, не поддерживающих POSIX. Числовые значения 1, 2 или 3 указывают, что входные файлы, выходные файлы или все файлы, соответственно, должны использовать двоичный ввод / вывод. Строковые значения r или w указывают, что входные или выходные файлы, соответственно, должны использовать двоичный ввод / вывод. Строковые значения rw или wr указывают, что все файлы должны использовать двоичный ввод / вывод.
ERRNO
Строка указывает на ошибку при сбое перенаправления для getline или сбое вызова close .
Выполнив этот код, вы получите следующий результат –
FIELDWIDTHS
Задан разделенный пробелами список переменных ширины поля, GAWK анализирует входные данные в поля фиксированной ширины вместо использования значения переменной FS в качестве разделителя полей.
IGNORECASE
Когда эта переменная установлена, GAWK становится без учета регистра. Следующий пример демонстрирует это –
Выполнив этот код, вы получите следующий результат –
Он обеспечивает динамическое управление опцией –lint из программы GAWK. Когда эта переменная установлена, GAWK печатает предупреждения lint. При присвоении строкового значения фатальному предупреждения lint становятся фатальными ошибками, точно так же как –lint = fatal .
Выполнив этот код, вы получите следующий результат –
PROCINFO
Это ассоциативный массив, содержащий информацию о процессе, такую как действительные и эффективные номера UID, идентификационный номер процесса и т. Д.
Выполнив этот код, вы получите следующий результат –
ДОМЕН
Он представляет собой текстовый домен программы AWK. Он используется для поиска локализованных переводов для строк программы.
Выполнив этот код, вы получите следующий результат –
Приведенный выше вывод показывает текст на английском языке из-за локали en_IN
AWK – Операторы
Как и другие языки программирования, AWK также предоставляет большой набор операторов. В этой главе объясняются операторы AWK с подходящими примерами.
AWK поддерживает следующие арифметические операторы.
AWK поддерживает следующие операторы увеличения и уменьшения.
AWK поддерживает следующие операторы присваивания.
AWK поддерживает следующие реляционные операторы.
AWK поддерживает следующие логические операторы.
Мы можем легко реализовать выражение условия, используя тернарный оператор.
AWK поддерживает следующие унарные операторы.
Существует два формата экспоненциальных операторов.
Пробел – это оператор конкатенации строк, который объединяет две строки.
Это представлено в . Используется при доступе к элементам массива.
Этот пример объясняет две формы операторов регулярных выражений.
AWK поддерживает следующие арифметические операторы.
AWK поддерживает следующие операторы увеличения и уменьшения.
AWK поддерживает следующие операторы присваивания.
AWK поддерживает следующие реляционные операторы.
AWK поддерживает следующие логические операторы.
Мы можем легко реализовать выражение условия, используя тернарный оператор.
AWK поддерживает следующие унарные операторы.
Существует два формата экспоненциальных операторов.
Пробел – это оператор конкатенации строк, который объединяет две строки.
Это представлено в . Используется при доступе к элементам массива.
Этот пример объясняет две формы операторов регулярных выражений.
AWK – Регулярные выражения
AWK очень мощный и эффективный в обработке регулярных выражений. Ряд сложных задач можно решить с помощью простых регулярных выражений. Любой эксперт командной строки знает силу регулярных выражений.
В этой главе рассматриваются стандартные регулярные выражения с подходящими примерами.
точка
Он соответствует любому отдельному символу, кроме символа конца строки. Например, следующий пример соответствует fin, fun, fan и т. Д.
пример
Выполнив приведенный выше код, вы получите следующий результат –
Выход
Начало строки
Это соответствует началу строки. Например, в следующем примере печатаются все строки, начинающиеся с шаблона The .
пример
Выполнив этот код, вы получите следующий результат –
Выход
Конец линии
Это соответствует концу строки. Например, в следующем примере печатаются строки, заканчивающиеся буквой n .
пример
Выход
Выполнив этот код, вы получите следующий результат –
Совпадает с набором символов
Используется для соответствия только одному из нескольких символов. Например, следующий пример соответствует шаблону Call и Tall, но не Ball .
пример
Выход
Выполнив этот код, вы получите следующий результат –
Эксклюзивный набор
В эксклюзивном наборе карат сводит на нет набор символов в квадратных скобках. Например, следующий пример печатает только Ball .
пример
Выполнив этот код, вы получите следующий результат –
Выход
Внесение изменений
Вертикальная черта позволяет регулярным выражениям быть логически ИЛИ. Например, следующий пример печатает Ball and Call .
пример
Выполнив этот код, вы получите следующий результат –
Выход
Ноль или одно вхождение
Это соответствует нулю или одному вхождению предыдущего символа. Например, следующий пример соответствует цвету, а также цвет . Мы сделали вас необязательным персонажем, используя ? ,
пример
Выполнив этот код, вы получите следующий результат –
Выход
Ноль или более вхождение
Это соответствует нулю или более вхождений предыдущего символа. Например, следующий пример соответствует ca, cat, catt и так далее.
пример
Выполнив этот код, вы получите следующий результат –
Выход
Одно или несколько вхождений
Это соответствует одному или нескольким вхождениям предыдущего символа. Например, приведенный ниже пример соответствует одному или нескольким вхождениям из 2 .
пример
Выполнив приведенный выше код, вы получите следующий результат –
Выход
группирование
Круглые скобки () используются для группировки и символа | используется для альтернатив. Например, следующее регулярное выражение соответствует строкам, содержащим либо Apple Juice, либо Apple Cake .
пример
Выполнив этот код, вы получите следующий результат –
Выход
AWK – Массивы
У AWK есть ассоциативные массивы, и одно из лучших преимуществ – индексы не должны быть непрерывным набором чисел; Вы можете использовать строку или число в качестве индекса массива. Кроме того, нет необходимости заранее объявлять размер массива – массивы могут расширяться / уменьшаться во время выполнения.
Его синтаксис выглядит следующим образом –
Синтаксис
Где array_name – имя массива, index – индекс массива, а value – любое значение, присваиваемое элементу массива.
Создание массива
Чтобы лучше понять массив, давайте создадим и получим доступ к элементам массива.
пример
Выполнив этот код, вы получите следующий результат –
Выход
В приведенном выше примере мы объявляем массив как фрукты , индекс которых является именем фруктов, а значение является цветом фруктов. Для доступа к элементам массива мы используем формат array_name [index] .
Удаление элементов массива
Для вставки мы использовали оператор присваивания. Точно так же мы можем использовать оператор delete для удаления элемента из массива. Синтаксис оператора удаления выглядит следующим образом:
Синтаксис
В следующем примере удаляется оранжевый элемент. Следовательно, команда не показывает никакого вывода.
пример
Многомерные массивы
AWK поддерживает только одномерные массивы. Но вы можете легко смоделировать многомерный массив, используя сам одномерный массив.
Например, ниже приведен трехмерный массив 3х3 –
В вышеприведенном примере массив [0] [0] хранит 100, массив [0] [1] хранит 200 и так далее. Чтобы сохранить 100 в массиве [0] [0], мы можем использовать следующий синтаксис –
Синтаксис
Хотя мы указали 0,0 как индекс, это не два индекса. На самом деле это всего один индекс со строкой 0,0 .
В следующем примере имитируется двумерный массив:
пример
Выполнив этот код, вы получите следующий результат –
Выход
Вы также можете выполнять различные операции над массивом, такие как сортировка его элементов / индексов. Для этого вы можете использовать функции сортировки и сортировки
AWK – Контроль потока
Как и другие языки программирования, AWK предоставляет условные операторы для управления потоком программы. В этой главе объясняются управляющие операторы AWK с подходящими примерами.
Если заявление
Он просто проверяет состояние и выполняет определенные действия в зависимости от условия. Ниже приведен синтаксис оператора if –
Синтаксис
Мы также можем использовать пару фигурных скобок, как указано ниже, для выполнения нескольких действий:
Синтаксис
Например, следующий пример проверяет, является ли число четным или нет –
пример
Выполнив приведенный выше код, вы получите следующий результат –
Выход
Если еще заявление
В синтаксисе if-else мы можем предоставить список действий, которые должны быть выполнены, когда условие становится ложным.
Синтаксис оператора if-else следующий:
Синтаксис
В приведенном выше синтаксисе действие-1 выполняется, когда условие оценивается как истинное, а действие-2 выполняется, когда условие оценивается как ложное. Например, следующий пример проверяет, является ли число четным или нет –
пример
Выполнив этот код, вы получите следующий результат –
Выход
If-Else-If Лестница
Мы можем легко создать лестницу if-else-if , используя несколько операторов if-else . Следующий пример демонстрирует это –
пример
Выполнив этот код, вы получите следующий результат –
Выход
AWK – Петли
Эта глава объясняет циклы AWK на подходящем примере. Циклы используются для повторного выполнения набора действий. Выполнение цикла продолжается до тех пор, пока условие цикла выполняется.
Для петли
Синтаксис цикла for –
Синтаксис
Сначала оператор for выполняет действие инициализации, затем проверяет условие. Если условие истинно, он выполняет действия, после чего выполняет операцию увеличения или уменьшения. Выполнение цикла продолжается до тех пор, пока условие выполняется. Например, следующий пример печатает от 1 до 5, используя цикл for –
пример
Выполнив этот код, вы получите следующий результат –
Выход
Пока петля
Цикл while продолжает выполнять действие до тех пор, пока конкретное логическое условие не станет истинным. Вот синтаксис цикла while –
Синтаксис
AWK сначала проверяет состояние; если условие истинно, выполняется действие. Этот процесс повторяется до тех пор, пока условие цикла оценивается как true. Например, следующий пример печатает от 1 до 5, используя цикл while –
пример
Выполнив этот код, вы получите следующий результат –
Выход
Do-While Loop
Цикл do- while похож на цикл while, за исключением того, что условие теста оценивается в конце цикла. Вот синтаксис цикла do- while –
Синтаксис
В цикле do- while оператор действия выполняется хотя бы один раз, даже если оператор условия оценивается как ложный. Например, следующий пример печатает от 1 до 5 чисел, используя цикл do- while –
пример
Выполнив этот код, вы получите следующий результат –
Выход
Перерыв Заявление
Как следует из названия, он используется для завершения выполнения цикла. Вот пример, который завершает цикл, когда сумма становится больше 50.
пример
Продолжить заявление
Оператор continue используется внутри цикла, чтобы перейти к следующей итерации цикла. Это полезно, когда вы хотите пропустить обработку некоторых данных внутри цикла. Например, следующий пример использует оператор continue для печати четных чисел от 1 до 20.
пример
Выполнив этот код, вы получите следующий результат –
Выход
Заявление о выходе
Он используется для остановки выполнения скрипта. Он принимает целое число в качестве аргумента, который является кодом состояния выхода для процесса AWK. Если аргумент не указан, выход возвращает нулевой статус. Вот пример, который останавливает выполнение, когда сумма становится больше 50.
пример
Давайте проверим статус возврата скрипта.
пример
Выполнив этот код, вы получите следующий результат –
Выход
AWK – Встроенные функции
AWK имеет ряд встроенных функций, которые всегда доступны программисту. В этой главе описываются арифметические, строковые, временные, битовые манипуляции и другие разные функции с подходящими примерами.
AWK имеет следующие встроенные арифметические функции.
AWK имеет следующие встроенные функции String.
AWK имеет следующие встроенные функции времени.
AWK имеет следующие встроенные функции управления битами.
AWK имеет следующие разные функции.
AWK имеет следующие встроенные арифметические функции.
AWK имеет следующие встроенные функции String.
AWK имеет следующие встроенные функции времени.
AWK имеет следующие встроенные функции управления битами.
AWK имеет следующие разные функции.
AWK – пользовательские функции
Функции являются основными строительными блоками программы. AWK позволяет нам определять наши собственные функции. Большая программа может быть разделена на функции, и каждая функция может быть написана / протестирована независимо. Это обеспечивает возможность повторного использования кода.
Ниже приведен общий формат пользовательской функции –
Синтаксис
В этом синтаксисе имя_функции – это имя пользовательской функции. Имя функции должно начинаться с буквы, а остальные символы могут быть любой комбинацией цифр, букв или символов подчеркивания. Резервные слова AWK нельзя использовать в качестве имен функций.
Функции могут принимать несколько аргументов, разделенных запятой. Аргументы не обязательны. Вы также можете создать пользовательскую функцию без каких-либо аргументов.
Тело функции состоит из одного или нескольких операторов AWK.
Напишем две функции, которые вычисляют минимальное и максимальное число, и вызовем эти функции из другой функции, называемой main . Файл functions.awk содержит –
пример
Выполнив этот код, вы получите следующий результат –
Выход
AWK – перенаправление вывода
Пока что мы выводим данные на стандартный поток вывода. Мы также можем перенаправить данные в файл. Перенаправление появляется после оператора print или printf . Перенаправления в AWK записываются так же, как перенаправление в командах оболочки, за исключением того, что они записываются в программе AWK. В этой главе объясняется перенаправление с подходящими примерами.
Оператор перенаправления
Синтаксис оператора перенаправления –
Синтаксис
Он записывает данные в выходной файл . Если выходной файл не существует, он создает его. Когда используется этот тип перенаправления, выходной файл стирается до того, как в него будет записан первый вывод. Последующие операции записи в тот же выходной файл не стирают выходной файл, а добавляют к нему. Например, следующий пример пишет Hello, World . в файл.
Давайте создадим файл с некоторыми текстовыми данными.
пример
Выполнив этот код, вы получите следующий результат –
Выход
Теперь давайте перенаправим некоторое содержимое в него с помощью оператора перенаправления AWK.
пример
Выполнив этот код, вы получите следующий результат –
Выход
Добавить оператора
Синтаксис оператора добавления выглядит следующим образом:
Синтаксис
Он добавляет данные в выходной файл . Если выходной файл не существует, он создает его. Когда используется этот тип перенаправления, новое содержимое добавляется в конец файла. Например, следующий пример добавляет Hello, World . в файл.
Давайте создадим файл с некоторыми текстовыми данными.
пример
Выполнив этот код, вы получите следующий результат –
Выход
Теперь давайте добавим к нему некоторое содержимое, используя оператор дополнения AWK.
пример
Выполнив этот код, вы получите следующий результат –
Выход
труба
Можно отправить вывод в другую программу через канал вместо использования файла. Это перенаправление открывает канал для команды и записывает значения элементов через этот канал в другой процесс для выполнения команды. Команда аргумента перенаправления на самом деле является выражением AWK. Вот синтаксис трубы –
Синтаксис
Давайте использовать команду tr для преобразования строчных букв в прописные.
пример
Выполнив этот код, вы получите следующий результат –
Выход
Двухстороннее общение
AWK может общаться с внешним процессом с помощью | & , который является двусторонней связью. Например, в следующем примере команда tr используется для преобразования строчных букв в прописные. Наш файл command.awk содержит –
пример
Выполнив этот код, вы получите следующий результат –
Выход
Сценарий выглядит загадочно? Позвольте нам демистифицировать это.
Первое утверждение, cmd = “tr [az] [AZ]” , является командой, с которой мы устанавливаем двустороннюю связь из AWK.
Следующий оператор, т. Е. Команда print, обеспечивает ввод команды tr . Здесь & | указывает на двустороннюю связь.
Третье утверждение, то есть close (cmd, “to”) , закрывает процесс после завершения его выполнения.
Следующий оператор cmd | & getline out сохраняет вывод в переменную out с помощью функции getline.
Следующая инструкция print печатает вывод, и, наконец, функция close закрывает команду.
Первое утверждение, cmd = “tr [az] [AZ]” , является командой, с которой мы устанавливаем двустороннюю связь из AWK.
Следующий оператор, т. Е. Команда print, обеспечивает ввод команды tr . Здесь & | указывает на двустороннюю связь.
Третье утверждение, то есть close (cmd, “to”) , закрывает процесс после завершения его выполнения.
Следующий оператор cmd | & getline out сохраняет вывод в переменную out с помощью функции getline.
Следующая инструкция print печатает вывод, и, наконец, функция close закрывает команду.
AWK – Pretty Printing
До сих пор мы использовали функции print и printf AWK для отображения данных на стандартном выводе. Но printf гораздо мощнее, чем мы видели раньше. Эта функция заимствована из языка Си и очень полезна при создании форматированного вывода. Ниже приведен синтаксис оператора printf:
Синтаксис
В приведенном выше синтаксисе fmt представляет собой строку спецификаций и констант формата. expr-list – это список аргументов, соответствующих спецификаторам формата.
Побег последовательности
Подобно любой строке, формат может содержать встроенные escape-последовательности. Ниже обсуждаются escape-последовательности, поддерживаемые AWK –
Новая линия
Следующий пример печатает Hello и World в отдельных строках, используя символ новой строки –
Выполнив этот код, вы получите следующий результат –
Горизонтальная вкладка
В следующем примере горизонтальная вкладка используется для отображения другого поля.
Выполнив приведенный выше код, вы получите следующий результат –
Вертикальная вкладка
В следующем примере используется вертикальная вкладка после каждого поля –
Выполнив этот код, вы получите следующий результат –
возврат на одну позицию
В следующем примере после каждого поля, кроме последнего, печатается символ возврата. Стирает последний номер из первых трех полей. Например, поле 1 отображается как поле , потому что последний символ удаляется с помощью возврата. Однако последнее поле Field 4 отображается как есть, поскольку у нас не было a \ b после поля 4 .
Выполнив этот код, вы получите следующий результат –
Возврат каретки
В следующем примере после печати каждого поля мы выполняем возврат каретки и печатаем следующее значение поверх текущего напечатанного значения. Это означает, что в конечном выводе вы видите только поле 4 , так как оно было последним, которое было напечатано поверх всех предыдущих полей.
Выполнив этот код, вы получите следующий результат –
Подача формы
В следующем примере используется подача формы после печати каждого поля.
Выполнив этот код, вы получите следующий результат –
Спецификатор формата
Как и в языке C, AWK также имеет спецификаторы формата. Версия AWK оператора printf принимает следующие форматы спецификации преобразования:
Он печатает один символ. Если аргумент, используемый для % c, является числовым, он обрабатывается как символ и печатается. В противном случае аргумент считается строкой, и печатается единственный первый символ этой строки.
Выполнив этот код, вы получите следующий результат –
% d и% i
Он печатает только целую часть десятичного числа.
Выполнив этот код, вы получите следующий результат –
% e и% E
Он печатает число с плавающей запятой в форме [-] d.dddddde [+ -] dd.
Выполнив этот код, вы получите следующий результат –
Формат % E использует E вместо e.
Выполнив этот код, вы получите следующий результат –
Он печатает число с плавающей запятой в форме [-] ddd.dddddd.
Выполнив этот код, вы получите следующий результат –
% g и% G
Использует% e или% f преобразование, в зависимости от того, что короче, с подавлением незначительных нулей.
Выполнив этот код, вы получите следующий результат –
Формат % G использует % E вместо% e.
Выполнив этот код, вы получите следующий результат –
Он печатает восьмеричное число без знака.
Выполнив этот код, вы получите следующий результат –
Он печатает десятичное число без знака.
Выполнив этот код, вы получите следующий результат –
Он печатает строку символов.
Выполнив этот код, вы получите следующий результат –
% x и% X
Он печатает шестнадцатеричное число без знака. Формат % X использует заглавные буквы вместо строчных.
Выполнив этот код, вы получите следующий результат –
Теперь давайте используем% X и наблюдаем результат –
Выполнив этот код, вы получите следующий результат –
Он печатает один символ %, и ни один аргумент не преобразуется.
Выполнив этот код, вы получите следующий результат –
Необязательные параметры с%
С % мы можем использовать следующие необязательные параметры –
ширина
Поле дополняется до ширины . По умолчанию поле заполняется пробелами, но когда используется флаг 0, оно заполняется нулями.
Выполнив этот код, вы получите следующий результат –
Ведущие нули
Ведущий ноль действует как флаг, который указывает, что выходные данные должны быть дополнены нулями вместо пробелов. Обратите внимание, что этот флаг действует только тогда, когда поле шире, чем значение для печати. Следующий пример описывает это –
Выполнив этот код, вы получите следующий результат –
Левое оправдание
Выражение должно быть выровнено по левому краю в пределах его поля. Если входная строка меньше указанного числа символов и вы хотите, чтобы она выравнивалась по левому краю, т. Е. Путем добавления пробелов справа, используйте знак минуса (-) сразу после% и перед числом.
В следующем примере выходные данные команды AWK передаются команде cat для отображения символа END OF LINE ($).
Выполнив этот код, вы получите следующий результат –
Знак префикса
Это всегда префикс числовых значений со знаком, даже если значение положительное.
Выполнив этот код, вы получите следующий результат –
гашиш
Для% o он поставляет ведущий ноль. Для% x и% X он предоставляет ведущие 0x или 0X соответственно, только если результат не равен нулю. Для% e,% E,% f и% F результат всегда содержит десятичную точку. Для% g и% G конечные нули не удаляются из результата. Следующий пример описывает это –