Piping tail -f no awk

6

Estou tentando canalizar o tail -f para o awk para monitorar um arquivo de log em tempo real, mas, de acordo com os exemplos, não deve haver problemas, mas não consigo fazê-lo funcionar.

aqui está o comando que estou executando

tail -f logfile.log | awk -F" " '{print $1, $2, $7, $8}'

Mas quando eu edito meu arquivo usando nano adiciono uma linha, ele não é impresso em tempo real, se eu executar o comando awk diretamente, minha nova linha aparece no resultado.

    
por gimpycpu 16.04.2014 / 03:35

3 respostas

9

Você não o vê em tempo real porque, para fins de eficiência, os pipes são armazenados em buffer. tail -f tem que preencher o buffer, normalmente 4 kB, antes que a saída seja passada para awk .

Uma correção é usar o comando unbuffer, que faz parte do pacote expect:

unbuffer tail -f logfile.log | awk -F" " '{print $1, $2, $7, $8}'

Isso engana tail ao pensar que está escrevendo para um terminal interativo. Como resultado, ele não armazena em buffer.

Para mais informações, consulte link

Alternativamente, se você tiver o GNU coreutils 7.5 ou melhor, você pode desabilitar o buffer de saída com o comando stdbuf:

stdbuf -o0 tail -f logfile.log | awk -F" " '{print $1, $2, $7, $8}'
    
por 16.04.2014 / 04:15
4

Acho que a @ resposta do John1024 não está correta, pois o prefixo stdbuf -o0 está mal posicionado. Ele pertence como o prefixo para o comando awk , não o comando tail -f , portanto, o comando correto deve ser:

tail -f logfile.log | stdbuf -o0 awk -F" " '{print $1, $2, $7, $8}'

Observe também que nem todas as versões do awk funcionarão nessa configuração específica. IOW, se você precisar que uma string de comando específica funcione como escrita, continue tentando várias versões do awk / gawk / mawk até encontrar uma que funcione.

    
por 13.09.2016 / 01:03
2

Você pode descompactá-lo adicionando um loop while, conforme indicado no exemplo abaixo. Eu testei isso em um arquivo de log em execução e funcionou para mim.

tail -f input.log | while read a; do echo "$a" | awk -F" " '{print $1, $2, $7, $8}' >> output.log; done
    
por 07.04.2015 / 18:56