A tubulação do grep para o awk não está funcionando

34

Estou tentando grepo andamento taildo log de arquivo e obtemos a npalavra th de uma linha. Arquivo de exemplo:

$ 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 grepque tail:

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

Mas se eu awkque grep:

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

Nada, não importa quanto tempo eu espero. Suspeito que tenha algo a ver com a maneira como o fluxo funciona.

Alguém tem alguma pista?

Belmin Fernandez
fonte

Respostas:

56

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

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

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

cas
fonte
8

Usando 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 awkos dados foram recebidos linha por linha ou como um bloco de dados maior. A versão GNU do grep envia a saída em blocos maiores, pois é mais eficiente, mas awkprecisa ler linha por linha, a fim de produzir linha por linha.

Coloque desta maneira: grepsó enviará dados quando o buffer estiver preenchido, o awk aguarda que o buffer seja preenchido, portanto não está enviando nada.

Arcege
fonte
4

Veja a --line-bufferedopção de grep.

choroba
fonte