Como canalizar a saída do fluxo ativo para outros comandos

2

Estou tentando canalizar um fluxo ativo para outro comando (talvez um script bash), mas ele sempre quer esperar que todo o fluxo seja concluído antes de processar o comando. s.g. Eu posso fazer isso:

tail file.log | grep keyword | xargs -L 1 echo ...

e exibe corretamente as linhas correspondentes de file.log, precedidas por "...". Obviamente, eu não quero apenas ecoar, isso é apenas para simplificar o exemplo (eu substituiria isso por um script bash personalizado). Agora, quando eu tento isso:

tail -f file.log | grep keyword

isso funciona, na qual saem as linhas correspondentes e, em seguida, faz uma pausa até que file.log seja alterado e, em seguida, gera quaisquer novas linhas correspondentes. No entanto, se eu tentar isso:

tail -f file.log | grep keyword | xargs -L 1 echo ...

Não produz nada - presumo que esteja esperando o fluxo aberto pela cauda -f terminar. Eu tentei isso também:

tail -f file.log | grep keyword | while read line; do echo...$line; end

sem alteração no comportamento. Eu li sobre outras questões aqui que isso deve funcionar. Estou executando o Ubuntu 14.04, existe alguma diferença por causa disso? Como posso fazer isso funcionar?

    
por lalitm 12.02.2016 / 04:47

1 resposta

1

Você está certo, xargs espera entrada da entrada padrão e, portanto, aguarda o fim do fluxo. Uma maneira de fazê-lo funcionar é por meio da substituição do processo , porque ...

Process substitution is a form of redirection where the input or output of a process (some sequence of commands) appear as a temporary file.

Então você deve tentar:

while IFS= read -r newline; do echo $newline | grep keyword | cat >> filename  ; done < <(tail -f file.log)

que dispensa xargs no total.

    
por 12.02.2016 / 07:33