Добро пожаловать в четвертую статью из цикла по AWK! На этот раз Вы узнаете о фильтрации текста по заданному шаблону с помощью данного скриптового языка. Мы рассмотрим один большой шаблон, который включает в себя сразу несколько различных метасимволов и регулярные выражения. Вы также узнаете, как использовать паттерны в командной строке AWK и как комбинировать их для создания более гибких фильтров.
Также советуем ознакомиться с третьей статьей: Как вывести на экран поля и столбцы файла с помощью awk.
Содержание:
Создание файла для фильтрации
Прежде всего, для фильтрации текста с помощью AWK нужно иметь файл, который содержит определенную информацию и будет обрабатываться. Например, создадим текстовый документ, в котором будет записана таблица с названиями курсов и их стоимостью:
Использование шаблона для фильтрации AWK
После того как файл создан, можно переходить к его обработке. Для вывода отфильтрованного текста будем использовать две команды:
print
;printf
.
Выполнение команды print в AWK
Допустим, нам нужно выделить в нашем документе строки, которые содержат цену курса, большую, чем $3. Для этого напишем в терминале Linux конструкцию из следующих выражений:
Данный код на языке AWK представляет собой два шаблона для поиска и фильтрации строк в файле courses.txt
.
- Первый шаблон
/ *\$[0-2]\.[0-9][0-9] */ { print ; }
ищет строки, в которых цена находится в диапазоне от $0.00 до $2.99, и выводит их без изменений с помощью командыprint
. - Второй шаблон
/ *\$[3-9]\.[0-9][0-9] */ { print $1, $2, $3, $4, "*" ; }
ищет строки, в которых цена находится в диапазоне от $3.00 до $9.99, и выводит их, добавляя звездочку*
с помощьюprint $1, $2, $3, $4, "*"
. - Знаки
$
и.
в регулярных выражениях обозначают, соответственно, конец строки и любой символ (кроме перевода строки). Чтобы использовать эти знаки в качестве обычных символов, их нужно экранировать символом «обратная коса» (Backslash) —\
.
Важно: экранирование указывает интерпретатору, что следующий за ним знак должен рассматриваться как обычный символ, а не как метасимвол.
Этот код фильтрует строки в файле courses.txt
по цене и добавляет звездочку в конце строк, где цена находится в диапазоне от $3.00 до $9.99.
Выполнение команды printf в AWK
Вы могли заметить, что в предыдущем примере поля строк, обозначенных в конце символом *
, после обработки «съехали» влево. Чтобы отформатировать текст вывода, будем вместо print
использовать в команде AWK оператор printf
:
На скриншоте видно, что содержимое файла стало похожим на таблицу. Рассмотрим детальнее использованную для этого конструкцию:
- В регулярных выражениях
/ *\$[3-9]\.[0-9][0-9] */
и/ *\$[0-2]\.[0-9][0-9] */
применяются метасимволы, которые указывают на цены от $3.00 до $9.99 и от $0.00 до $2.99, соответственно. - Команда
printf
используется для форматирования вывода, где:%10s
— означает, что поле занимает 10 символов;%-10s
— означает, что поле занимает 10 символов и выравнивается по левому краю;%s
— означает, что поле может содержать любое количество символов.
- На экран выводятся первые четыре поля каждой строки файла
courses.txt
. Если цена попадает в диапазон от $3.00 до $9.99, то в конце выводится знак*
.
Использование поля $0 в шаблоне AWK
В AWK поле $0
представляет всю строку в текущей обрабатываемой записи. Это означает, что поиск будет производиться по всей строке. Если поле $0
не указано явно в команде, то по умолчанию скриптовый язык будет использовать именно его. Модифицируем нашу конструкцию следующим образом:
Данная команда AWK читает файл courses.txt
и фильтрует строки по заданному шаблону:
/ *\$[3-9]\.[0-9][0-9] */
— шаблон для строк, содержащих цену от $3.00 до $9.99.{ print $0 "*" ; }
— действие, которое выполняется для строк, соответствующих первому шаблону, где$0
обозначает всю строку, а"*"
добавляет символ звездочки в конец строки./ *\$[0-2]\.[0-9][0-9] */
— шаблон для строк, содержащих цену от $0.00 до $2.99.{ print ; }
— действие, которое выполняется для строк, соответствующих второму шаблону. В данном случае весь текст строки выводится без изменений.
Выводы
В статье были рассмотрены основные принципы фильтрации текста с помощью AWK по шаблону. Мы показали различные способы применения паттернов в командах языка сценариев, включая специальныя действия для них. Освоив эти принципы, Вы сможете значительно упростить процесс фильтрации и обработки текстовых данных с помощью AWK.
Спасибо за время, уделенное прочтению статьи!
Если возникли вопросы — задавайте их в комментариях.
Подписывайтесь на обновления нашего блога и оставайтесь в курсе новостей мира инфокоммуникаций!
Чтобы знать больше и выделяться знаниями среди толпы IT-шников, записывайтесь на курсы Cisco, курсы по кибербезопасности, полный курс по кибербезопасности, курсы DevNet / DevOps (программируемые системы) от Академии Cisco, курсы Linux от Linux Professional Institute на платформе SEDICOMM University (Университет СЭДИКОММ).
Курсы Cisco, Linux, кибербезопасность, DevOps / DevNet, Python с трудоустройством!
- Поможем стать экспертом по сетевой инженерии, кибербезопасности, программируемым сетям и системам и получить международные сертификаты Cisco, Linux LPI, Python Institute.
- Предлагаем проверенную программу с лучшими учебниками от экспертов из Cisco Networking Academy, Linux Professional Institute и Python Institute, помощь сертифицированных инструкторов и личного куратора.
- Поможем с трудоустройством и стартом карьеры в сфере IT — 100% наших выпускников трудоустраиваются.
- Проведем вечерние онлайн-лекции на нашей платформе.
- Согласуем с вами удобное время для практик.
- Если хотите индивидуальный график — обсудим и реализуем.
- Личный куратор будет на связи, чтобы ответить на вопросы, проконсультировать и мотивировать придерживаться сроков сдачи экзаменов.
- Всем, кто боится потерять мотивацию и не закончить обучение, предложим общение с профессиональным коучем.
- отредактировать или создать с нуля резюме;
- подготовиться к техническим интервью;
- подготовиться к конкурсу на понравившуюся вакансию;
- устроиться на работу в Cisco по специальной программе. Наши студенты, которые уже работают там: жмите на #НашиВCisco Вконтакте, #НашиВCisco Facebook.