bash - salida - redireccionar entrada estandar c
Salida de cola de tubería aunque grep dos veces (2)
Con un registro de acceso de Apache típico, puede ejecutar:
tail -f access_log | grep "127.0.0.1"
Lo que solo le mostrará los registros (a medida que se crean) para la dirección IP especificada.
Pero, ¿por qué falla esto cuando lo canaliza a través de grep
por segunda vez, para limitar aún más los resultados?
Por ejemplo, una simple exclusión para ".css":
tail -f access_log | grep "127.0.0.1" | grep -v ".css"
no mostrará ninguna salida.
Creo que el problema aquí es que el primer grep está almacenando en búfer la salida, lo que significa que el segundo grep no lo verá hasta que se vacíe el búfer.
Intente agregar la opción --line-buffered
en su primer grep:
tail -f access_log | grep --line-buffered "127.0.0.1" | grep -v ".css"
Para obtener más información, consulte "BashFAQ / 009 - ¿Qué es el almacenamiento en búfer? O, ¿por qué mi línea de comando no produce salida: tail -f logfile | grep ''foo bar'' | awk ...
"
Este es el resultado del almacenamiento en búfer, que eventualmente se imprimirá cuando haya suficiente información disponible.
Use la opción --line-buffered
como lo sugiere Shawn Chin o si stdbuf
está disponible, puede obtener el mismo efecto con:
tail -f access_log | stdbuf -oL grep "127.0.0.1" | grep -v ".css"