Piping de grep para awk não funciona

28

Estou tentando grep do tail do log de arquivos em andamento e obtenho a n th palavra de uma linha. Exemplo de arquivo:

$ cat > test.txt <<EOL
Beam goes blah
John goes hey
Beam goes what?
John goes forget it
Beam goes okay
Beam goes bye
EOL
^C

Agora, se eu fizer um tail :

$ tail -f test.txt
Beam goes blah
John goes hey
Beam goes what?
John goes forget it
Beam goes okay
Beam goes bye
^C

Se eu grep que tail :

$ tail -f test.txt | grep Beam
Beam goes blah
Beam goes what?
Beam goes okay
Beam goes bye
^C

Mas se eu awk que grep :

$ tail -f test.txt | grep Beam | awk '{print $3}'

Nada, não importa quanto tempo eu espere. Eu suspeito que é algo a ver com o funcionamento do stream.

Alguém tem alguma pista?

    
por Belmin Fernandez 30.08.2012 / 14:04

3 respostas

51

Provavelmente é o buffer de saída do grep. você pode desabilitar isso com grep --line-buffered .

Mas você não precisa canalizar a saída do grep para o awk. O awk pode fazer o padrão regexp correspondente sozinho.

tail -f test.txt | awk '/Beam/ {print $3}'

    
por 30.08.2012 / 14:20
8

Usar tail -f test.txt | awk '/Beam/{print $3}' funciona para mim. Além de usar tail -f test.txt | grep --line-buffered Beam | awk '{print $3}' (gnu grep).

O problema aqui é se awk recebeu os dados linha por linha ou como um bloco de dados maior. A versão GNU do grep envia a saída em blocos maiores, já que é mais eficiente, mas awk precisa ler linha por linha para poder sair linha por linha.

Coloque desta forma: grep só enviará dados quando o buffer estiver cheio, o awk está esperando que o buffer seja preenchido, então está enviando nada.

    
por 30.08.2012 / 14:19
4

Veja a opção --line-buffered de grep .

    
por 30.08.2012 / 14:19