Isso é basicamente uma duplicata da minha resposta no SO . No entanto, como ninguém mencionou o comando stdbuf aqui, senti que também deveria acrescentar isso aqui.
===============
Basicamente, um processo que lê de um pipe pode consumir os dados byte a byte assim que eles estiverem disponíveis no pipe. No entanto, desde que os programas usem as funções std io da libc, como read, write etc, a libc armazenará em buffer a entrada / saída desses programas dependendo se um programa está gravando ou não em um terminal.
Por padrão, se um programa estiver gravando em um terminal, a libc armazenará em buffer a linha de saída, se não for para um terminal, ele será armazenado em bloco.
No Linux, com o glibc, você pode influenciar esse comportamento usando o comando stdbuf , assim:
stdbuf -oL cat | stdbuf -ioL sed '' | stdbuf -iL sed ''
Estou usando um buffer de saída baseado em linha para o comando cat , um buffer de entrada e saída baseado em linha para o primeiro comando sed e um buffer de entrada baseado em linha para o último comando sed .