Saída de piping de um comando para o grep e depois para outro comando [duplicado]

3

Estou pegando a saída de um script e, em seguida, canalizando essa putput para grep e canalizando a saída do grep para outro script:

./script1 | grep 'expr' | ./script2

No entanto, o segundo script nunca recebe nenhuma entrada. Novamente, nada é impresso quando substituo script2 por cat e script1 por ping :

ping localhost | grep localhost | cat

A mesma coisa acontece se eu substituir grep por awk :

ping localhost|awk '{print $1}'|cat

O que está acontecendo?

    
por user3469976 30.04.2018 / 11:53

1 resposta

4

grep está armazenando em buffer (porque determina que sua saída não é terminal; a rigor, esse é o comportamento da biblioteca C).

Para desabilitar isso, execute-o com unbuffer -p (o -p é necessário para que unbuffer leia sua entrada padrão):

ping localhost | unbuffer -p grep localhost | cat

ou diga grep ao buffer por linha (se ele suportar isso):

ping localhost | grep --line-buffered localhost | cat
    
por 30.04.2018 / 11:59

Tags