Como Filtrar Texto ou String Usando Awk e Expressões Regulares – Parte 1

Quando executamos certos comandos no Linux para ler ou editar texto a partir de uma string ou arquivo, muitas vezes tentamos filtrar a saída para uma seção específica de interesse. É aqui que o uso de expressões regulares é útil.

O que são Expressões Regulares?

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.

Recursos das Expressões Regulares

Expressões regulares são compostas de:

  • Caracteres comuns como espaço, sublinhado (_), A-Z, a-z, 0-9.
  • Meta-caracteres que são expandidos para caracteres comuns, incluem:
    • (.) corresponde a qualquer caractere único, exceto uma nova linha.
    • (*) corresponde a zero ou mais ocorrências do caractere imediatamente anterior a ele.
    • [caractere(s)] corresponde a qualquer um dos caracteres especificados em caractere(s), também pode-se usar um hífen (-) para significar um intervalo de caracteres como [a-f], [1-5], e assim por diante.
    • ^ corresponde ao início de uma linha em um arquivo.
    • $ corresponde ao final da linha em um arquivo.
    • \ é um caractere de escape.

Para filtrar texto, é necessário usar uma ferramenta de filtragem de texto como awk. Você pode pensar no awk como uma linguagem de programação própria. Mas para o escopo deste guia sobre o uso do awk, vamos abordá-lo como uma simples ferramenta de filtragem de linha de comando.

A sintaxe geral do awk é:

awk 'script' filename

Onde 'script' é um conjunto de comandos entendidos pelo awk e são executados no arquivo, filename.

Ele funciona lendo uma linha dada no arquivo, fazendo uma cópia da linha e então executando o script na linha. Isso é repetido em todas as linhas do arquivo.

O 'script' está na forma '/padrão/ ação' onde o padrão é uma expressão regular e a ação é o que o awk fará quando encontrar o padrão dado em uma linha.

Como Usar a Ferramenta de Filtragem Awk no Linux

Nos exemplos a seguir, vamos nos concentrar nos meta caracteres que discutimos acima sob as funcionalidades do awk.

Imprimir Todas as Linhas do Arquivo Usando Awk

O exemplo abaixo imprime todas as linhas no arquivo /etc/hosts pois nenhum padrão é fornecido.

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

Usar Padrões Awk: Correspondendo Linhas com ‘localhost’ no Arquivo

No exemplo abaixo, um padrão localhost foi fornecido, então o awk irá corresponder à linha contendo localhost no arquivo /etc/hosts.

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

Usando Awk com (.) Curinga em um Padrão

O (.) corresponderá a strings contendo loc, localhost, localnet no exemplo abaixo.

Ou seja, * l algum_caractere_único c *.

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

Usando Awk com (*) Caractere em um Padrão

Corresponderá a strings contendo localhost, localnet, linhas, capaz, como no exemplo abaixo:

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

Você também perceberá que (*) tenta obter a correspondência mais longa possível que ele pode detectar.

Vamos ver um caso que demonstra isso, pegue a expressão regular t*t que significa corresponder a strings que começam com a letra t e terminam com t na linha abaixo:

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

Você obterá as seguintes possibilidades quando usar o padrão /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

E (*) em /t*t/ caractere curinga permite que o awk escolha a última opção:

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

Usando Awk com conjunto [caractere(s) ]

Por exemplo, o conjunto [al1], aqui o awk corresponderá a todas as strings contendo o caractere a ou l ou 1 em uma linha no arquivo /etc/hosts.

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

O próximo exemplo corresponde a strings começando com K ou k seguido por T:

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

Especificar caracteres em um intervalo

Compreender caracteres com awk:

  • [0-9] significa um único número
  • [a-z] significa corresponder a uma única letra minúscula
  • [A-Z] significa corresponder a uma única letra maiúscula
  • [a-zA-Z] significa corresponder a uma única letra
  • [a-zA-Z 0-9] significa corresponder a uma única letra ou número

Vamos ver um exemplo abaixo:

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

Toda a linha do arquivo /etc/hosts contém pelo menos um único número [0-9] no exemplo acima.

Usar Awk com o Meta Caractere (^)

Ele corresponde a todas as linhas que começam com o padrão fornecido, como no exemplo abaixo:

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

Usar Awk com o Meta Caractere ($)

Ele corresponde a todas as linhas que terminam com o padrão fornecido:

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

Usar Awk com o Caractere de Escape (\)

Isso permite que você considere o caractere seguinte como literal, ou seja, considerá-lo exatamente como é.

No exemplo abaixo, o primeiro comando imprime todas as linhas do arquivo, e o segundo comando não imprime nada porque desejo corresponder a uma linha que tenha $25.00, mas nenhum caractere de escape é usado.

O terceiro comando está correto, pois um caractere de escape foi usado para interpretar $ como é.

awk '//{print}' deals.txt
awk '/$25.00/{print}' deals.txt
awk '/\$25.00/{print}' deals.txt
Use Awk with Escape Character
Resumo

Isso não é tudo com a ferramenta de filtragem de linha de comando awk, os exemplos acima são as operações básicas do awk. Nas próximas partes, vamos avançar sobre como usar recursos complexos do awk.

Obrigado por ler e por quaisquer adições ou esclarecimentos, poste um comentário na seção de comentários.

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