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!