Este é um tipo de resposta hacky / incomum, o fato é que isso é provavelmente possível de uma forma não muito limpa.
grep parece apenas imprimir a saída quando encontra um caractere de nova linha, sua barra de progresso provavelmente não introduz um caractere de nova linha quando é atualizado, daí o seu problema.
strace é uma ferramenta usada para visualizar as chamadas do sistema que um comando está chamando, isso inclui coisas como ler e escrever coisas na memória / armazenamento, bem como abrir / fechar descritores de arquivos.
Com strace você pode ver o que um processo está acessando, no caso de seu canal stout ser passado para grep , então com strace você pode ver o texto sendo alimentado para grep . strace será regularmente enviado a saída proveniente do comando canalizado, e você pode cheirar essa saída e exibi-lo. Eu estava testando com rsync --progress , o que parece ter um cenário semelhante. Eu usei grep no ##% porque é isso que o rsync usa para mostrar o progresso.
rsync --progress file1 file2 | strace -e trace=read grep "[0-9]*%"
Se você executar esse comando, verá que strace não tem resultados bons, mas que quando eu usei, strace capturou alguns read s do rsync que grep normalmente write , mostrando read s para 0%, 21%, 45%, 68%, 91% e 100%, parecia atualizar sobre cada segundo (provavelmente com base na frequência com que rsync atualiza o progresso).
Então, com isso você pode grep a strace output, o que não é muito bom, chamando o mesmo grep novamente.
rsync --progress file1 file2 | strace -e trace=read grep "[0-9]*%" 2>&1 > /dev/null | grep -o "[0-9]*%"
O 2>&1 é importante porque strace é impresso em stderr . O > /dev/null redireciona stdout para /dev/null para evitar que a saída do primeiro grep seja reportada. O resultado final disso foi a seguinte saída:
0%
21%
45%
68%
91%
100%
Você terá que trocar o grep , mas parece que vai dar certo. Não é bonito, mas funciona e trabalha em torno das restrições de grep . Parece que um grep -f que funciona como tail -f seria útil (eu sei que grep -f já está em uso).
O primeiro grep é principalmente apenas para filtrar o texto que strace será read ing, pois somente as linhas correspondentes serão listadas em strace s read chamadas, mas você também precisa de algo para o texto estar se movendo através de strace pode assisti-lo.