- Команда AWK в Linux с примерами
- Как работает awk
- Записи и поля
- Программа awk
- Выполнение программ awk
- Шаблоны AWK
- Шаблоны регулярных выражений
- Шаблоны реляционных выражений
- Шаблоны диапазонов
- Специальные шаблоны выражения
- Комбинирование узоров
- Встроенные переменные
- Изменение поля и разделителя записей
- Действия при отсутствии нагрузки
- Использование переменных оболочки в программах AWK
- Выводы
- На awk нескольких разделитель
- 6 ответов
- Как использовать несколько разделителей в AWK
- Что такое разделители?
- Разделитель полей AWK RegEx
- Использовать несколько разделителей
- Заключение
Команда 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 нескольких разделитель
у меня есть файл, который содержит следующие строки:
в приведенном выше выходе я хочу извлечь 3 поля (Номер 2, 4 и последний *.example.com ). Я получаю следующий результат:
как извлечь последнее поле с доменным именем, которое находится после ‘=’ ? Как использовать multiple delimiter извлечь поле?
6 ответов
разделитель может быть регулярное выражение.
хорошая новость! awk разделитель полей может быть регулярное выражение. Вам просто нужно использовать -F» | |. » :
-F=»/|=» задает поле ввода сепаратора, либо / или = . Затем он устанавливает разделитель выходного поля на вкладку.
см. другой пример:
этот файл имеет два разделителя полей, # и _ . Если мы хотим напечатать второе поле независимо от того, является ли разделитель одним или другим,давайте сделаем оба разделителя!
где файлы пронумерованы следующим образом:
Если ваш пробел согласован, вы можете использовать его в качестве разделителя, а также вместо вставки \t сразу, вы смогли установить разделитель выхода и он будет включен автоматически:
используются следующие параметры командной строки:
-n обведите каждую строку входного файла, поместите строку в $_ переменная, не печатайте автоматически каждую строку
-l удаляет новые строки перед обработкой и добавляет их обратно после
-a режим autosplit-perl автоматически разделит входные линии на @F массив. По умолчанию разделение на пробелы
-F модификатор autosplit, в этом примере разбивается на / или =
-e выполнить код perl
Perl тесно связан с awk, однако, @F массив autosplit начинается с index $F[0] в то время как поля awk начинаются с $1.
для разделителя полей любого числа 2 через 5 и буквы a или # или пробел, где разделяющий символ должен быть повторен не менее 2 раз и не более 6 раз, например:
Я уверен, что вариации этого существуют с использованием () и параметров
Я вижу, что на доске много идеальных ответов, но все равно хотел бы загрузить свой кусок кода,
Источник
Как использовать несколько разделителей в AWK
AWK — это мощный язык программирования с сопоставлением шаблонов, который работает в командной строке для поиска различных шаблонов в выходных данных команд и файлах.
Мы можем считать AWK улучшением по сравнению с Sed, поскольку он предлагает больше функций, включая массивы, переменные, циклы и старые добрые регулярные выражения.
В этом руководстве мы быстро обсудим, как можно использовать несколько разделителей в команде AWK. Прежде чем мы продолжим, обратите внимание, что это руководство не является руководством по AWK для начинающих, и я не имел его в виду.
Что такое разделители?
Я уверен, что, поскольку вы нашли время, чтобы прочитать эту статью, вы знакомы с концепцией разделителей. Но не помешает подвести итоги, так что давайте сделаем это сейчас:
Вкратце, разделители — это последовательность символов, используемых для разделения текстовых значений строк. Существуют различные распространенные типы разделителей, в том числе:
Имя | Символ |
Запятая | , |
Двоеточие | : |
Точка с запятой | ; |
Период | . |
Трубка | | |
Обратная косая черта | \ |
Слэш | / |
Скобки | () |
Фигурные скобки | <> |
Квадратных скобках | [] |
Пробел |
Разделитель полей AWK RegEx
Разделитель полей AWK (FS) используется для определения и управления тем, как AWK разбивает запись на различные поля. Кроме того, он может принимать один символ регулярного выражения. После того как вы укажете регулярное выражение в качестве значения для FS, AWK сканирует входные значения на предмет последовательности символов, заданных в регулярном выражении.
Мы собираемся реализовать функциональность AWK для приема значений регулярного выражения в разделителе полей для подключения нескольких разделителей.
Использовать несколько разделителей
Чтобы проиллюстрировать, как разделить с помощью нескольких разделителей в AWK, я буду использовать простой пример, чтобы показать вам, как использовать эту функцию.
Предположим, у вас есть файл со следующими данными:
Из приведенного выше файла мы хотим получить результат, аналогичный показанному ниже:
Чтобы разделить файл с помощью различных разделителей — в данном случае двоеточия, пробела и вертикальной черты — мы можем использовать команду, как показано ниже:
Приведенная выше команда выводит информацию, как показано ниже:
Как видите, вы можете комбинировать более одного разделителя в разделителе полей AWK, чтобы получить конкретную информацию.
Заключение
В этом кратком руководстве мы обсудили использование AWK для разделения нескольких разделителей во входном файле.
Источник