Usando expressões regulares em Awk
- 1860
- 144
- Maurice Champlin
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:
Metacharacter | Descriçã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:
12345 | awk '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:
1234 | awk '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.TXT12345678 | 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 |
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.TXT1234 | awk '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.txt12345 | awk '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.TXT12345 | awk '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.TXT12345 | awk '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.