Команда awk linux описание

Содержание
  1. Команда AWK в Linux с примерами
  2. Как работает awk
  3. Записи и поля
  4. Программа awk
  5. Выполнение программ awk
  6. Шаблоны AWK
  7. Шаблоны регулярных выражений
  8. Шаблоны реляционных выражений
  9. Шаблоны диапазонов
  10. Специальные шаблоны выражения
  11. Комбинирование узоров
  12. Встроенные переменные
  13. Изменение поля и разделителя записей
  14. Действия при отсутствии нагрузки
  15. Использование переменных оболочки в программах AWK
  16. Выводы
  17. Язык обработки шаблонов awk
  18. Чтение awk-скриптов из командной строки
  19. Позиционные переменные, хранящие данные полей
  20. Использование нескольких команд
  21. Чтение скрипта awk из файла
  22. Выполнение команд до начала обработки данных
  23. Выполнение команд после окончания обработки данных
  24. Основные встроенные переменные
  25. Дополнительные встроенные переменные
  26. Пользовательские переменные
  27. Условный оператор if
  28. Цикл while
  29. Цикл for
  30. Массивы
  31. Форматированный вывод данных
  32. Встроенные функции
  33. Математические функции
  34. Строковые функции
  35. Функция system
  36. Пользовательские функции
  37. Шаблоны

Команда 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:

Читайте также:  Samba не пускает пользователя windows

Шаблоны диапазонов

Шаблоны диапазонов состоят из двух шаблонов, разделенных запятой:

Все записи, начинающиеся с записи, соответствующей первому шаблону, до совпадения с записью, соответствующей второму шаблону.

Вот пример, который напечатает первое поле всех записей, начиная с записи, включая «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 можно выполнять следующие действия:

  • Объявлять переменные для хранения данных.
  • Использовать арифметические и строковые операторы для работы с данными.
  • Использовать управляющие операторы и циклы, что позволяет реализовать сложные алгоритмы.
  • Создавать форматированные отчёты.
Читайте также:  What is the terminal app on mac os

Вызов 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 :

Читайте также:  Cs mac os с ботами

Переменная 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 массив
  • (переменная, переменная, …) in массив
  • (переменная

    /шаблон/) || (выражение in массив)

  • (переменная >= 100) && (переменная
  • В случае использования относительных выражений , , == , != , >= , > происходит сравнение чисел, если оба операнда — числа. В противном случае сравниваются строки.

    Источник

    Оцените статью