Muitas implementações do grep usam a linha em buffer quando a saída padrão é terminal. Quando a saída padrão é terminal, geralmente é uma sessão interativa, você deseja obter dados o mais rápido possível. Portanto, grep
gravará os dados na saída padrão assim que visualizar uma nova linha.
Quando a saída padrão não é terminal (geralmente significa sessão não interativa), grep
usará o buffer de bloco. Isso significa que grep
não grava na saída padrão imediatamente ao ver uma nova linha. grep
coleta a quantidade de dados (4096 bytes no Linux) antes de gravar na saída padrão.
Algum grep
versão, como GNU grep ou BSD grep tem --buffered por linha . Isso faz com que grep
sempre grave na saída padrão ao ver uma nova linha. Então, seu exemplo se tornará:
mplayer *.* 2>/dev/null | grep --line-buffered Playing | awk '{print "Mplayer: "$1}'
Se a sua versão grep
não tiver --line-buffer
, você pode fazer tudo com awk
:
mplayer *.* 2>/dev/null | awk '/Playing/{print "Mplayer: "$1}'
O GNU coreutils tem uma ferramenta stdbuf para modificar o buffer de comando. Você sempre pode forçar o buffer de linha na saída padrão com:
stdbuf -oL command
Há também o comando unbuffer que desativa somente o buffer de saída.
Outras leituras