- Команда AWK в Linux с примерами
- Как работает awk
- Записи и поля
- Программа awk
- Выполнение программ awk
- Шаблоны AWK
- Шаблоны регулярных выражений
- Шаблоны реляционных выражений
- Шаблоны диапазонов
- Специальные шаблоны выражения
- Комбинирование узоров
- Встроенные переменные
- Изменение поля и разделителя записей
- Действия при отсутствии нагрузки
- Использование переменных оболочки в программах AWK
- Выводы
- Язык обработки шаблонов awk
- Чтение awk-скриптов из командной строки
- Позиционные переменные, хранящие данные полей
- Использование нескольких команд
- Чтение скрипта awk из файла
- Выполнение команд до начала обработки данных
- Выполнение команд после окончания обработки данных
- Основные встроенные переменные
- Дополнительные встроенные переменные
- Пользовательские переменные
- Условный оператор if
- Цикл while
- Цикл for
- Массивы
- Форматированный вывод данных
- Встроенные функции
- Математические функции
- Строковые функции
- Функция system
- Пользовательские функции
- Шаблоны
Команда 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 .
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.
Источник
Язык обработки шаблонов 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 позволяет программисту объявлять переменные. Имена переменных могут включать в себя буквы, цифры, символы подчёркивания. Однако, они не могут начинаться с цифры:
Каждая переменная или поле могут потенциально быть строкой или числом. 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 это не просто строка или регулярное выражение. Они могут быть произвольными комбинациями относительных выражений (больше, меньше, равно, не равно, …) и регулярных выражений с использованием ! , || , && и круглых скобок:
/шаблон/
/шаблон/) || (выражение in массив)
В случае использования относительных выражений , , == , != , >= , > происходит сравнение чисел, если оба операнда — числа. В противном случае сравниваются строки.
Источник