grep e sed com pipe de tail -f parece estar armazenando em cache

grep e sed com pipe de tail -f parece estar armazenando em cache

Estou tentando obter um sistema funcional para monitorar logs especiais. Normalmente, eu só quero um padrão muito específico do qual extraio usando grepum pipe tail -f. Percebi que o grep não produz tudo, mas mantém algumas linhas em buffer. Acho que faz sentido se você tiver um canal que produza tudo e, em seguida, encerre e feche o fluxo.
Mas com tail -fisso não funciona para mim.

O mesmo problema aparece com sed.

Aqui está um exemplo de comando que desejo 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 pipes me leva às entradas mais recentes.

Como posso evitar esse cache nos pipes?

Responder1

Adicionar grepopção --line-bufferede sedopção --unbuffered.

Responder2

Use a opção grepde --line-buffered.

Por padrão, os utilitários usam buffer de linha se sua saída padrão for um terminal, mas usam buffers maiores (provavelmente 4 ou 8 kB) quando sua saída está conectada a um descritor de arquivo ou canal.

Você tem sorte de tail -Fusar buffer de linha por padrão e grepter uma opção de linha de comando para ativar isso. Não conheço um método genérico para ativar o buffer de linha para um comando arbitrário.

informação relacionada