O que faz o buffer de linha grep?

13

Este é o meu comando que estou usando em um script para grep dados em tempo real. Ele não parece puxar os dados em tempo real corretamente, uma vez que simplesmente perde algumas linhas.

tail -f <file> | fgrep "string" | sed 's/stuff//g' >> output.txt

Qual seria o seguinte comando? O que é "buffer de linha"?

tail -f <file> | fgrep --line-buffered "string" | sed 's/stuff//g' >> output.txt
    
por Roboman1723 17.12.2014 / 05:13

1 resposta

29

Ao usar de forma não interativa, a maioria dos comandos padrão, inclua grep , armazene a saída no buffer, o que significa que ela não grava dados imediatamente em stdout . Ele coleta uma grande quantidade de dados (depende do SO, no Linux, geralmente 4096 bytes) antes de gravar.

Em seu comando, a saída de grep é canalizada para o comando stdin of sed , portanto, grep armazena em buffer sua saída.

Portanto, a opção --line-buffered está causando grep usando o buffer de linha, o que significa gravar a saída toda vez que ele viu uma nova linha, em vez de esperar atingir 4096 bytes por padrão. Mas, neste caso, você não precisa de grep , apenas use tail + sed :

tail -f <file> | sed '/string/s/stuff//g' >> output.txt

Com o comando que não tem a opção de modificar o buffer, você pode usar GNU coreutils stdbuf

tail -f <file> | stdbuf -oL fgrep "string" | sed 's/stuff//g' >> output.txt

para ativar o buffer de linha ou usar -o0 para desativar o buffer.

Nota

por cuonglm 17.12.2014 / 05:59

Tags