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

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

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

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

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

O próximo exemplo corresponde a strings começando com K
ou k
seguido por T
:
# awk '/[Kk]T/{print}' /etc/hosts

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

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

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

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

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/