Adicione a opção grep
--line-buffered
e a opção sed
--unbuffered
.
Estou tentando obter um sistema em funcionamento para monitorar logs especiais. Eu normalmente só quero um padrão muito específico que eu extraia usando grep
e um pipe de tail -f
. Tenho notado que o grep não produz tudo, mas mantém algumas linhas em buffer. Eu acho que faz sentido se você tem um pipe que irá produzir tudo e, em seguida, encerrar e fechar o fluxo.
Mas com tail -f
isso não funciona para mim.
O mesmo problema aparece com sed
.
Aqui está um exemplo de comando que eu quero usar:
clear && tail -F -n1000 /var/log/fail2ban.log | grep 'WARNING.*Ban' | sed s/'fail2ban.actions: WARNING '//g | grep -E --color 'ssh-iptables-perma|$'
Para fornecer um exemplo:
A última linha do comando acima é esta:
2015-05-04 11:17:24,551 [ssh-iptables] Ban x.x.x.x
E usando este comando:
clear && tail -F -n1000 /var/log/fail2ban.log | grep 'WARNING.*Ban' | sed s/'fail2ban.actions: WARNING '//g
A última linha é esta:
2015-05-04 19:45:17,615 [ssh-iptables] Ban y.y.y.y
A remoção de outros canais leva-me até as entradas mais recentes.
Como posso evitar esse cache nos pipes?
Use a opção grep
--line-buffered
.
Por padrão, os utilitários usam buffer de linha se sua saída padrão é um terminal, mas usam buffers maiores (provavelmente 4 ou 8 kB) quando sua saída está conectada a um descritor de arquivo ou a um pipe.
Você tem sorte de que tail -F
use o buffer de linha por padrão e grep
tenha uma opção de linha de comando para ativá-lo. Eu não estou ciente de um método genérico para ativar o buffer de linha para um comando arbitrário.
Tags command-line bash grep sed linux