AWK no meio de um pipe não retorna saída

0

Eu quero processar todos os arquivos de log alterados do apache e fiz um oneliner simples:

inotifywait --format="%w%f" -rm /var/log/apache2/ | gawk '{ print }'

Este é exatamente o meu começo. Mas se eu canalizar essa saída mais, não receberei saída:

inotifywait --format="%w%f" -rm /var/log/apache2/ | gawk '{ print }' | wc -l

De qualquer forma, se eu usar 'ls', 'tail' (o que eu realmente quero), nunca há saída (em outro console, executando a primeira instrução, eu sei, há mudanças). Eu tentei com a adição de stdbuf, fflush (), nada funciona. Eu não entendo o problema! Eu quero manter este onliner em um script, que eu possa usar como um ponto de string. Caso contrário, eu poderia (mas não desejo) usar xargs. Qualquer ajuda ou dicas seria ótimo!

    
por mabra 19.07.2018 / 00:08

1 resposta

2

O motivo pelo qual você não obtém a saída é porque wc -l está consumindo toda a saída. Você pode usar tee em combinação com a substituição de processo para obter awk para a saída para o console e também ler wc :

inotifywait --format="%w%f" -rm /var/log/apache2/ | gawk '{ print }' | tee >(wc -l)

Isso ainda é um pouco problemático, pois inotifywait é um comando que nunca sai, mas wc -l não imprime a saída até ler todos os dados, neste caso, quando o pipe é fechado. Você pode fazer sua contagem diretamente em awk :

inotifywait --format="%w%f" -rm /var/log/apache2/ | gawk 'BEGIN { total=0 } { print; total++; print total } END { print "final total: " total }'
    
por 19.07.2018 / 03:32

Tags