Usando expressões regulares em Awk

Usando expressões regulares em Awk

Expressões regulares são uma ferramenta poderosa para processamento de texto em Awk. Eles permitem que você procure padrões em um arquivo de texto e manipule os dados com base nesses padrões. Neste artigo, exploraremos como usar expressões regulares em Awk com exemplos.

Básico de expressão regular

Expressões regulares são padrões que correspondem a um conjunto específico de caracteres. A tabela a seguir lista alguns dos metacharacters de expressão regular básica que você pode usar no AWK:

MetacharacterDescrição
.Corresponde a qualquer personagem
[]Corresponde a qualquer personagem dentro dos colchetes
^Corresponde ao início de uma linha
$Corresponde ao fim de uma linha
*Corresponde a zero ou mais ocorrências do personagem anterior
+Corresponde a uma ou mais ocorrências do personagem anterior
?Corresponde zero ou uma ocorrência do personagem anterior

A AWK fornece duas funções internas para o uso de expressões regulares: corresponder() e sub(). O corresponder() A função é usada para encontrar a primeira ocorrência de uma expressão regular em uma string e sub() é usado para substituir a primeira ocorrência de uma expressão regular em uma corda. aqui estão alguns exemplos:

Exemplo 1: Combinando uma expressão regular

Digamos que temos um arquivo contendo uma lista de endereços de email e queremos encontrar todos os endereços de e -mail que terminam com ““.com ”. Podemos usar o corresponder() função para realizar esta tarefa da seguinte forma:

awk 'if (corresponde ($ 0, /\.com $/)) print $ 0 'email.TXT
12345awk 'if (corresponde ($ 0, /\.com $/)) print $ 0 'email.TXT

Aqui, usamos o corresponder() função para procurar a expressão regular /.com $/ (que corresponde a qualquer string que termine com “.com ”) em cada linha do arquivo. Se uma partida for encontrada, imprimimos a linha.

Exemplo 2: Substituindo uma expressão regular

Digamos que temos um arquivo contendo uma lista de números de telefone e queremos substituir todas as instâncias de “555” com “666”. Podemos usar o sub() função para realizar esta tarefa da seguinte forma:

awk 'sub (/555/, "666", $ 0) imprimir $ 0' telefone.TXT
1234awk 'sub (/555/, "666", $ 0) imprimir $ 0' telefone.TXT

Aqui, usamos o sub() função para procurar a expressão regular /555/ (que corresponde a qualquer string que contenha “555”) em cada linha do arquivo e substitua -a por “666”. Em seguida, imprimimos a linha modificada.

Técnicas avançadas de expressão regular

Além da expressão regular básica Metacharacters, o AWK suporta várias técnicas avançadas de expressão regular que podem ajudá -lo a realizar tarefas de processamento de texto mais complexas. Esses incluem:

1. Agrupamento:

Você pode agrupar partes de uma expressão regular usando parênteses. Isso permite que você aplique um quantificador ao grupo como um todo, ou extrair partes específicas da string correspondente.

Digamos que temos um arquivo contendo uma lista de nomes e salários dos funcionários, e queremos extrair os nomes e salários separadamente. Podemos usar o agrupamento para realizar esta tarefa da seguinte forma:

awk 'if (match ($ 0, /^(\ w+) \ s+(\ d+) $ /)) name = substr ($ 0, salário rstart, rlength) = substrato ($ 0, rstart+comprimento (nome) +1 , comprimento ($ 0) -RSTART-Length (nome)) Nome de impressão Salário de impressão 'funcionários.TXT
12345678awk 'if (match ($ 0, /^(\ w+) \ s+(\ d+) $ /)) name = substr ($ 0, salário rstart, rlength) = substrato ($ 0, rstart+comprimento (nome) +1 , comprimento ($ 0) -RSTART-Length (nome)) Nome de impressão Salário de impressão 'funcionários.TXT

Aqui, usamos o agrupamento para corresponder à expressão regular /^(\ w+) \ s+(\ d+) $ / (que corresponde a uma linha que contém um ou mais caracteres de palavras seguidos por um ou mais caracteres brancos, seguidos por um ou mais dígitos) e extraia o nome e o salário separadamente.

2. Referências de fundo:

Você pode usar referências de backs (eu.e., \ 1, \ 2, etc.) referir -se a partes da expressão regular que foram correspondidas por um grupo. Isso permite que você reutilize substâncias correspondentes na sequência de substituição.

Digamos que temos um arquivo contendo uma lista de números de telefone no formato (xxx) xxx-xxxx, e queremos alterar o formato para xxx-xxx-xxxx. Podemos usar referências para realizar esta tarefa da seguinte forma:

awk 'sub (/\ ((\ d 3) \) (\ d 3)-(\ d 4)/, "\ 1- \ 2- \ 3", $ 0) imprimir $ 0 ' telefone.TXT
1234awk 'sub (/\ ((\ d 3) \) (\ d 3)-(\ d 4)/, "\ 1- \ 2- \ 3", $ 0) imprimir $ 0 ' telefone.TXT

Aqui, usamos referências de backs (eu.e., \ 1, \ 2 e \ 3) para se referir aos três grupos de dígitos correspondidos pela expressão regular “/(\ D3) (\ d3) (\ d 3)-(\ d 4)/” (que corresponde a um número de telefone no formato (xxx) xxx-xxxx) e substitua o formato por xxx-xxx-xxxx.

3. Lookahead e LookBehind:

Você pode usar o lookahead (?=) e lookbehind (?<=) para corresponder aos padrões apenas se eles forem seguidos ou precedidos por outro padrão, respectivamente.

Digamos que temos um arquivo contendo uma lista de URLs, e queremos extrair apenas os nomes de domínio (i.e., o texto entre “Http: //” e o próximo "/" personagem). Podemos usar o Lookahead e o LookBehind para realizar esta tarefa da seguinte maneira:

awk 'if (corresponde ($ 0, /(?<=http:\/\/)[^\/]+/)) print substr($0, RSTART, RLENGTH) ' urls.txt
12345awk 'if (corresponde ($ 0, /(?<=http:\/\/)[^\/]+/)) print substr($0, RSTART, RLENGTH) ' urls.txt

Aqui, nós usamos lookahead (?<=) Para combinar com a expressão regular “/((?<=http://)[^/]+/" (que corresponde a todos os personagens que vêm depois “Http: //” E antes do próximo "/" personagem) e extraia o nome de domínio.

4. Classes de caracteres negadas:

Digamos que temos um arquivo contendo uma lista de endereços de email e queremos extrair apenas os endereços que pertencem a um domínio específico (e.g., exemplo.com). Podemos usar classes de caracteres negadas para realizar esta tarefa da seguinte forma:

awk 'if (corresponde ($ 0, /^[^@]+@exemplo \.com $/)) print $ 0 'e -mails.TXT
12345awk 'if (corresponde ($ 0, /^[^@]+@exemplo \.com $/)) print $ 0 'e -mails.TXT

Aqui, usamos uma classe de personagem negada ([^@]+) Para combinar com qualquer personagem que não seja "@" e extraia o nome de usuário e depois combine com a corda literal "@exemplo.com ” para garantir que o endereço pertence ao domínio especificado.

5. Alternância:

Digamos que temos um arquivo contendo uma lista de números de telefone e queremos extrair apenas os números que estão no formato “(xxx) xxx-xxxx” ou “xxx-xxx-xxxx”. Podemos usar a alternância para realizar esta tarefa da seguinte forma:

awk 'if (match ($ 0, /\ ((\ d 3) \) (\ d 3)-(\ d 4) | (\ d 3)-(\ d 3 )-(\ d 4)/)) Print substr ($ 0, rstart, rlength) 'telefones.TXT
12345awk 'if (match ($ 0, /\ ((\ d 3) \) (\ d 3)-(\ d 4) | (\ d 3)-(\ d 3 )-(\ d 4)/)) Print substr ($ 0, rstart, rlength) 'telefones.TXT

Aqui, usamos alternância (|) Para combinar com a expressão regular “/(\ D3) (\ d3) (\ d 3)-(\ d 4)/” (que corresponde a um número de telefone no formato (xxx) xxx-xxxx) ou a expressão regular “/(\ D 3)-(\ d 3)-(\ d 4)/” (que corresponde a um número de telefone no formato xxx-xxx-xxxx).

Conclusão

Expressões regulares são uma ferramenta poderosa para processamento de texto em Awk. Eles permitem que você procure padrões em um arquivo de texto e manipule os dados com base nesses padrões. Ao dominar expressões regulares no AWK, você pode se tornar mais eficaz e eficiente em suas tarefas de processamento de texto e realizar manipulação complexa de dados com facilidade.