grep e sed com pipe da cauda -f parece estar em cache

2

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?

    
por BrainStone 04.05.2015 / 20:33

2 respostas

6

Adicione a opção grep --line-buffered e a opção sed --unbuffered .

    
por 04.05.2015 / 20:42
2

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.

    
por 04.05.2015 / 20:41