La tuyauterie de grep à awk ne fonctionne pas

34

J'essaie de grepconsulter le tailfichier en cours et de récupérer le nmot de la ligne. Exemple de fichier:

$ 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

Maintenant si je fais 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

Si je grepcela tail:

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

Mais si je awkça grep:

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

Rien n’importe combien de temps j’attends. Je soupçonne que cela a quelque chose à voir avec le fonctionnement du flux.

Quelqu'un a un indice?

Belmin Fernandez
la source

Réponses:

56

C'est probablement la mise en tampon de sortie de grep. vous pouvez désactiver cela avec grep --line-buffered.

Mais vous n'avez pas besoin de canaliser la sortie de grep dans awk. awk peut faire du filtrage de motif regexp tout seul.

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

cas
la source
8

Utiliser des tail -f test.txt | awk '/Beam/{print $3}'œuvres pour moi. En plus d'utiliser tail -f test.txt | grep --line-buffered Beam | awk '{print $3}'(gnu grep).

Le problème ici est de savoir si awkles données sont reçues ligne par ligne ou sous la forme d’un bloc de données plus grand. La version GNU de grep envoie la sortie en blocs plus grands car elle est plus efficace, mais elle awkdoit être lue ligne par ligne pour pouvoir être affichée ligne par ligne.

Dit de cette façon: grepn’enverra des données que lorsque le tampon sera rempli, awk attend que ce tampon soit rempli, donc il n’envoie rien.

Arcege
la source
4

Voir l' --line-bufferedoption de grep.

choroba
la source