Il piping da grep a awk non funziona


34

Sto cercando di grepcontinuare tailil registro dei file e ottenere la nparola th da una riga. File di esempio:

$ 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

Ora se faccio un 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 io grepquello tail:

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

Ma se io awkquello grep:

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

Niente, non importa quanto tempo aspetto. Sospetto che abbia a che fare con il modo in cui funziona il flusso.

Qualcuno ha qualche idea?

Risposte:


56

Probabilmente è il buffering dell'output da grep. puoi disabilitarlo con grep --line-buffered.

Ma non è necessario reindirizzare l'output da grep in awk. awk può fare il pattern regexp facendo corrispondere tutto da solo.

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


8

Usare tail -f test.txt | awk '/Beam/{print $3}'funziona per me. Oltre a usare tail -f test.txt | grep --line-buffered Beam | awk '{print $3}'(gnu grep).

Il problema qui è se awki dati sono stati ricevuti riga per riga o come blocco dati più grande. La versione GNU di grep invia l'output in blocchi più grandi poiché è più efficiente, ma awkdeve leggere riga per riga per poter generare riga per riga.

In questo modo: grepinvierà i dati solo quando il buffer è riempito, awk è in attesa che il buffer sia riempito, quindi non sta inviando nulla.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.