O que faz o buffer da linha grep?


25

Aqui está o meu comando que estou usando em um script para grepdados em tempo real. Não parece extrair dados em tempo real corretamente, pois apenas perde algumas linhas.

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

O que o comando a seguir faria? O que é "buffer de linha"?

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

Respostas:


44

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

Em seu comando, grepde saída é canalizada para stdinde sedcomando, de modo que grepo buffer sua saída.

Portanto, --line-bufferedopção que causa o grepuso do buffer de linha, ou seja, escrever a saída toda vez que ela vê uma nova linha, em vez de esperar para atingir 4096 bytes por padrão. Mas, neste caso, você não precisa grep, basta usar tail+ sed:

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

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

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

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

Nota

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.