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