Pular para o conteúdo

Introdução ao awk

Dica publicada em Shell Script / Expressões Regulares
Fábio Berbert de Paula fabio
Hits: 7.259 Categoria: Shell Script Subcategoria: Expressões Regulares
  • Indicar
  • Impressora
  • Denunciar
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

Introdução ao awk

O awk funciona de forma similar ao grep e sed, provendo recursos de filtragem sobre texto. Sua diferença é que ele provê recursos adicionais de tratamento de resultado que nos permite a criação de filtros um pouco mais sofisticados que as ferramentas supracitadas.

Então quando usar grep, sed ou awk?
  • grep é indicado para filtros simples;
  • sed indicado para substituição;
  • awk indicado para filtros mais sofisticados.

Se for pensar em desempenho, dê sempre a preferência para o grep, depois sed e por fim awk.

Essa é a primeira dica de uma série que publicarei sobre awk, espero que gostem!

O awk pode receber entrada do STDIN (input do terminal) ou ler um arquivo. Por exemplo, quero filtrar todas as linhas que contenham "fabio" no arquivo /etc/passwd:

cat /etc/passwd | awk '/fabio/'
fabio:x:1000:1000:fabio,,,:/home/fabio:/bin/bash

Agora quero filtrar todas as linhas que NÃO contenham "fabio" em /etc/passwd (usei a negação "!"):

awk '!/fabio/' /etc/passwd

Sempre que o awk filtra alguma expressão, ela é armazenada na variável $0. Sendo assim o primeiro exemplo:

cat /etc/passwd | awk '/fabio/'

É similar a:

cat /etc/passwd | awk '/fabio/{print $0}'

Já vá se acostumando ao par de chaves, é ali dentro que a mágica do awk acontece!

Substituição

Para finalizar a dica, vamos ver como fazer substituição básica com awk. Quero substituir "1000" por "1001" na linha do usuário "fabio". Usaremos o comando "sub":

awk '/fabio/{ sub(/1000/,"1001"); print $0 }' /etc/passwd

Eu também poderia ter executado a substituição em todo o arquivo com a seguinte sintaxe:

awk '{ sub(/1000/,"1001"); print $0 }' /etc/passwd

O comando "sub" irá executar a substituição somente na PRIMEIRA OCORRÊNCIA. Para substituir todas as ocorrências, use o gsub:

awk '{ gsub(/1000/,"1001"); print $0 }' /etc/passwd
fabio:x:1001:1001:fabio,,,:/home/fabio:/bin/bash

Até a próxima!

O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

Uma breve análise dos principais editores HTML

7 cursos gratuitos - Python, JavaScript, Linux e Segurança

Capturando sua tela em forma de vídeo com xvidcap

Como editar arquivos remotos usando o Vim

Informações sobre semáforos e memória compartilhada

Baixando todos os arquivos de uma URL com o wget

Criando usuários a partir de uma lista

Exibindo o nome completo dos pacotes instalados no Debian e derivados

sed - Eliminando linhas em branco

Como remover parêntesis dos nomes de arquivos

#1 Comentário enviado por maurixnovatrento em 28/07/2020 - 23:32h

Legal. É uma alternativa. Mas como tô treinado no sed, vai ser difícil trocar. Não tem o que eu não consigo fazer com ele.

___________________________________
Conhecimento não se Leva para o Túmulo.

Contribuir com comentário

Entre na sua conta para comentar.