Problema com registro em tempo real, inspeção da tubulação, grep e cut

3

Eu tenho que inspecionar um log crescente em tempo real, e eu encontrei um problema que me faz perder algumas linhas (não consigo entender exatamente quais linhas) usando tail -f ou tailf , grep e cut .

Eu uso grep porque quero filtrar linhas contendo uma palavra específica e, em seguida, cut -c -NUM porque algumas linhas são muito longas e não quero que elas sejam incluídas na minha janela de terminal.

Aqui está um exemplo mínimo, no qual estou assistindo a um registro de amostra feito de linhas "Nth line" , filtrando a palavra "line" , faltando todas as linhas neste caso (obviamente ^C é eu matando o processo):

$ tail -n 3 -f log

13th line
14th line
15th line
^C

$ tail -n 3 -f log | grep --color=never 'line'

13th line
14th line
15th line
^C

$ echo $COLUMNS

100

$ tail -n 3 -f log | grep --color=never 'line' | cut -c -$COLUMNS

^C

Tenha em atenção que este problema ocorre apenas com tail -f (ou tailf ), grep e cut combinado . Se eu não usar grep no meio ou cut no final do canal, não haverá linha faltando. Se eu substituir tail -f por tail ou cat , não há problema. Você pode ver todos os casos possíveis em este exemplo mais longo .

Estou no Ubuntu 13.04, GNU coreutils ( tail , cut ) versão 8.20 e GNU grep 2.14.

    
por lorenzo-s 04.07.2013 / 11:28

1 resposta

5

O problema com o seu exemplo é o armazenamento em buffer entre grep e cut . Os dados só serão passados ao longo do pipe quando o buffer estiver cheio (4kB no meu sistema).

Tente adicionar --line-buffered a grep para liberar o buffer após cada linha.

    
por 04.07.2013 / 12:10

Tags