você está aqui: Home  → Arquivo de Mensagens

Boas práticas de programação bash - grep e awk

Colaboração: Rubens Queiroz de Almeida

Data de Publicação: 13 de janeiro de 2015

É muito comum fazermos coisas como:

  grep "not found" | awk '{ print $7 }' /var/log/mail.log

Este comando tem por objetivo listar os problemas na entrega de mensagens. O sétimo campo do arquivo mail.log indica o destinatário da mensagem de email que está apresentando problemas.

Mas eu não preciso de dois comandos para realizar esta operação. Apenas o comando awk pode dar conta desta tarefa:

  awk '/not found/ { print $7 }' /var/log/mail.log

Referência: 10 Tips for Writing Efficient Bash Scripts



Veja a relação completa dos artigos de Rubens Queiroz de Almeida

 

 

Opinião dos Leitores

Paul
20 Mar 2015, 17:49
Hi users,

My Text format example :

AA
CC
BB
AA
CC
CC
AA
BB
CC
AA

I need to get only this sequence of lines:

AA
BB
CC

Any suggestion for use grep, awk or sed in this case?
Xinuo
03 Fev 2015, 13:59
Eu não costumo usar o cat apenas para canalizar para outros programas, meu olho otimizador não deixa. E como não costumo usar o awk, prefiro usar o cut. Assim nunca faria o que foi feito no primeiro exemplo (que está errado, por sinal). Eu usaria assim:

grep 'not found' /var/log/mail.log | cut -d' ' -f8

Bem lembrado essa do [g]awk procurar e imprimir um campo. Entretanto procuro usar outros programas, bem menores, assim, mesmo que lembrasse dessa do gawk, acho que iria usar como acima, por acreditar ser bem mais rápido, deixando o gawk para tarefas mais complexas.

Vejam os tamanhos dos programas aqui no meu SO:

gawk 338 kB
cut 36 kB
cat 25 kB
sed 55 kB
grep 88 kB

Para quem quiser comparar o tempo de execução pode usar algo como:

cd /var/log
time { grep 'not found' mail.log | cut -d' ' -f8; }
time { gawk '/not found/ { print $7 }' mail.log ; }

Aqui no meu sistema, deu empate técnico. Para verificar se há um vencedor, precisaria ver outros aspectos, como o uso de memória por cada solução.
Sérgio Luiz Araújo Silva
14 Jan 2015, 11:02
Boa observação Rubens, especialmente para os novatos no mundo [LU]nix, temos de fato que considerar todos os níveis de usuário ao compartilhar informações.

Particularmente aprendi a fazer coisas como:

less file.txt

Ao invés de

cat file.txt | less

lembrando ainda que dentro do less se você pressionar a letra "v" ele abrirá o conteúdo no vim, o que facilita a cópia de trechos de um manual por exemplo.

Você pode fazer uma seleção visual e copiar para a área de transferência com o comando:

:'<,'>y+
Arnaldo Mandel
14 Jan 2015, 09:48
O caso que motiva a dica é irreal. Quem escreveria desse jeito, na verdade escreve


cat /var/log/mail.log | grep "not found" | awk '{ print $7 }'
*Nome:
Email:
Me notifique sobre novos comentários nessa página
Oculte meu email
*Texto:
 
  Para publicar seu comentário, digite o código contido na imagem acima
 


Powered by Scriptsmill Comments Script