it-swarm-eu.dev

Potrubí od grep k awk nefunguje

Snažím se grep probíhající tail protokolu souborů a získat nth Word z řádku. Příklad souboru:

$ 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

Nyní, když udělám 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

Pokud jsem grep, že tail:

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

Pokud ale awk, že grep:

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

Nic nezáleží na tom, jak dlouho čekám. Mám podezření, že to má něco společného s tím, jak stream funguje.

Někdo má tušení?

35
Belmin Fernandez

Je to pravděpodobně výstupní vyrovnávací paměť z grepu. můžete to zakázat pomocí grep --line-buffered.

Ale nemusíte potrubí výstup z grep do awk. awk umí regexp přizpůsobit všechny vzorky sám.

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

57
cas

Použitím tail -f test.txt | awk '/Beam/{print $3}' pracuje pro mě. Stejně jako pomocí tail -f test.txt | grep --line-buffered Beam | awk '{print $3}' (gnu grep).

Problém je v tom, pokud awk obdržel datový řádek po řádku nebo jako jeden větší datový blok. Verze GNU grep) odesílá výstup ve větších blocích, protože je efektivnější, ale awk potřebuje číst řádek po řádku, aby mohl vydávat řádek po řádku.

Řekněte to takto: grep bude odesílat data pouze tehdy, když je vyrovnávací paměť zaplněna, awk čeká na vyplnění vyrovnávací paměti, takže nic neposílá.

8
Arcege

Podívejte se na --line-buffered možnost grep.

4
choroba