¿Qué hace el almacenamiento en línea de grep?

25

Aquí está mi comando que estoy usando en un script para grepdatos en tiempo real. No parece extraer datos en tiempo real correctamente, ya que solo pierde algunas líneas.

tail -f <file> | fgrep "string" | sed 's/stuff//g' >> output.txt

¿Qué haría el siguiente comando? ¿Qué es el "buffer de línea"?

tail -f <file> | fgrep --line-buffered "string" | sed 's/stuff//g' >> output.txt
Roboman1723
fuente

Respuestas:

44

Cuando se usa de forma no interactiva, la mayoría de los comandos estándar incluyen, incluir en el grepbúfer la salida, lo que significa que no escribe datos inmediatamente stdout. Recopila una gran cantidad de datos (depende del sistema operativo, en Linux, a menudo 4096 bytes) antes de escribir.

En su comando, grepsalida 's se canaliza stdinde sedcomandos, así grepamortiguar su salida.

Entonces, la --line-bufferedopción causa el grepuso del búfer de línea, lo que significa escribir la salida cada vez que ve una nueva línea, en lugar de esperar a alcanzar 4096 bytes de forma predeterminada. Pero en este caso, no necesitas grepnada, solo usa tail+ sed:

tail -f <file> | sed '/string/s/stuff//g' >> output.txt

Con el comando que no tiene la opción de modificar el búfer, puede usar GNU coreutils stdbuf

tail -f <file> | stdbuf -oL fgrep "string" | sed 's/stuff//g' >> output.txt

para activar el almacenamiento en línea o usar -o0para desactivar el almacenamiento en búfer.

Nota

Cuonglm
fuente