Как фильтровать текст или строку с помощью Awk и регулярных выражений – Часть 1

Когда мы выполняем определённые команды в Linux, чтобы читать или редактировать текст из строки или файла, мы часто пытаемся отфильтровать вывод для конкретного интересующего нас раздела. В этом случае полезно использовать регулярные выражения.

Что такое регулярные выражения?

A regular expression can be defined as strings that represent several sequences of characters. One of the most important things about regular expressions is that they allow you to filter the output of a command or file, edit a section of a text or configuration file, and so on.

Особенности регулярного выражения

Регулярные выражения состоят из:

  • Обычные символы, такие как пробел, подчеркивание (_), A-Z, a-z, 0-9.
  • Метасимволы, которые расширяются до обычных символов, включают в себя:
    • (.) – совпадает с любым одиночным символом, кроме символа новой строки.
    • (*) – совпадает с нулевым или более наличием непосредственно предшествующего ему символа.
    • [ символ(ы) ] – совпадает с любым из указанных символов, также можно использовать дефис (-) для указания диапазона символов, например, [a-f], [1-5] и т. д.
    • ^ – совпадает с началом строки в файле.
    • $ – совпадает с концом строки в файле.
    • \ – это символ экранирования.

Для фильтрации текста необходимо использовать инструмент фильтрации текста, такой как awk. Вы можете рассматривать awk как отдельный язык программирования. Но для целей данного руководства по использованию awk, мы рассмотрим его как простой инструмент фильтрации командной строки.

Общий синтаксис awk таков:

awk 'script' filename

Где 'script' – это набор команд, понимаемых awk и выполняемых над файлом, filename.

Он работает, считывая данную строку в файле, создавая копию строки и затем выполняя скрипт над строкой. Это повторяется для всех строк в файле.

'script' имеет форму '/pattern/ действие', где pattern – это регулярное выражение, а действие – это то, что awk сделает, когда он найдет данное совпадение в строке.

Как использовать инструмент фильтрации Awk в Linux

В следующих примерах мы сосредоточимся на метасимволах, о которых мы говорили выше, в рамках возможностей awk.

Печать всех строк из файла с использованием Awk

Приведенный ниже пример печатает все строки в файле /etc/hosts, так как шаблон не задан.

awk '//{print}'/etc/hosts
Awk Prints All Lines in a File

Использование шаблонов Awk: Сопоставление строк с «localhost» в файле

localhost был указан в качестве шаблона, поэтому awk найдет строку с localhost в файле /etc/hosts.

awk '/localhost/{print}' /etc/hosts 
Awk Print Given Matching Line in a File

Использование Awk с (.) подстановочным символом в шаблоне

(.) будет соответствовать строкам, содержащим loc, localhost, localnet в приведенном ниже примере.

Это означает * l некоторый_одиночный_символ с *.

awk '/l.c/{print}' /etc/hosts
Use Awk to Print Matching Strings in a File

Использование Awk с (*) символом в шаблоне

Он будет соответствовать строкам, содержащим localhost, localnet, lines, capable, как в приведенном ниже примере:

awk '/l*c/{print}' /etc/localhost
Use Awk to Match Strings in File

Вы также поймете, что (*) пытается найти самое длинное совпадение, которое может обнаружить.

Давайте рассмотрим случай, который это демонстрирует, возьмем регулярное выражение t*t, что означает соответствие строк, которые начинаются с буквы t и заканчиваются t в строке ниже:

this is tecmint, where you get the best good tutorials, how to's, guides, tecmint. 

Вы получите следующие возможности, когда используете шаблон /t*t/:

this is t
this is tecmint
this is tecmint, where you get t
this is tecmint, where you get the best good t
this is tecmint, where you get the best good tutorials, how t
this is tecmint, where you get the best good tutorials, how tos, guides, t
this is tecmint, where you get the best good tutorials, how tos, guides, tecmint

И (*) в символе подстановки /t*t/ позволяет awk выбрать последний вариант:

this is tecmint, where you get the best good tutorials, how to's, guides, tecmint

Использование Awk с набором [символ(ы)]

Возьмем, например, набор [al1], здесь awk будет соответствовать всем строкам, содержащим символ a или l или 1 в строке в файле /etc/hosts.

awk '/[al1]/{print}' /etc/hosts
Use-Awk to Print Matching Character in File

Следующий пример соответствует строкам, начинающимся с K или k, за которыми следует T:

# awk '/[Kk]T/{print}' /etc/hosts 
Use Awk to Print Matched String in File

Перечисление символов в диапазоне

Понимание символов с помощью awk:

  • [0-9] означает одну цифру
  • [a-z] означает совпадение с одной строчной буквой
  • [A-Z] означает совпадение с одной заглавной буквой
  • [a-zA-Z] означает совпадение с одной буквой
  • [a-zA-Z 0-9] означает совпадение с одной буквой или цифрой

Давайте рассмотрим пример ниже:

awk '/[0-9]/{print}' /etc/hosts 
Use Awk To Print Matching Numbers in File

Все строки из файла /etc/hosts содержат по крайней мере одну цифру [0-9] в приведенном выше примере.

Используйте Awk с метасимволом (^)

Это сопоставляет все строки, которые начинаются с указанного образца, как в примере ниже:

# awk '/^fe/{print}' /etc/hosts
# awk '/^ff/{print}' /etc/hosts
Use Awk to Print All Matching Lines with Pattern

Используйте Awk с метасимволом ($)

Это сопоставляет все строки, которые заканчиваются указанным образцом:

awk '/ab$/{print}' /etc/hosts
awk '/ost$/{print}' /etc/hosts
awk '/rs$/{print}' /etc/hosts
Use Awk to Print Given Pattern String

Используйте Awk с экранировочным символом (\)

Он позволяет вам рассматривать следующий за ним символ как буквальный, то есть просто как есть.

В приведенном ниже примере первая команда выводит все строки из файла, а вторая команда ничего не выводит, потому что я хочу сопоставить строку, содержащую $25.00, но не используется экранировочный символ.

Третья команда верна, так как экранировочный символ был использован для чтения $ как есть.

awk '//{print}' deals.txt
awk '/$25.00/{print}' deals.txt
awk '/\$25.00/{print}' deals.txt
Use Awk with Escape Character
Резюме

Это еще не все с командным инструментом фильтрации строк awk, приведенные выше примеры – базовые операции awk. В следующих частях мы будем продвигаться в изучении сложных функций awk.

Спасибо за прочтение и за любые дополнения или уточнения, оставьте комментарий в разделе комментариев.

Source:
https://www.tecmint.com/use-linux-awk-command-to-filter-text-string-in-files/