La tubería de grep a awk no funciona

34

Estoy tratando de grepcontinuar con tailel registro de archivos y obtener la npalabra th de una línea. Archivo de ejemplo:

$ 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

Ahora si hago 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 yo grepeso tail:

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

Pero si yo awkeso grep:

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

Nada, no importa cuánto tiempo espere. Sospecho que tiene algo que ver con la forma en que funciona la transmisión.

Alguien tiene alguna pista?

Belmin Fernandez
fuente

Respuestas:

56

Probablemente sea un búfer de salida de grep. puedes deshabilitar eso con grep --line-buffered.

Pero no necesita canalizar la salida de grep a awk. awk puede hacer coincidir patrones regexp por sí solo.

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

cas
fuente
8

Usar tail -f test.txt | awk '/Beam/{print $3}'obras para mí. Además de usar tail -f test.txt | grep --line-buffered Beam | awk '{print $3}'(gnu grep).

El problema aquí es si se awkreciben los datos línea por línea o como un bloque de datos más grande. La versión GNU de grep envía la salida en bloques más grandes, ya que es más eficiente, pero awknecesita leer línea por línea para generar línea por línea.

Dicho de esta manera: grepsolo enviará datos cuando se llene el búfer, awk está esperando que se llene ese búfer, por lo que no envía nada.

Arcege
fuente
4

Ver la --line-bufferedopción de grep.

choroba
fuente