2009-06-09 6 views
26

Estoy usando 'tail -f' para seguir un archivo de registro a medida que se actualiza; luego canalizo la salida de eso a grep para mostrar solo las líneas que contienen un término de búsqueda ("org.springframework" en este caso); Finalmente me gustaría hacer es una tubería de la salida de grep para un tercer mandato, 'corte':¿Cómo canalizar la entrada a través de grep a otra utilidad?

tail -f logfile | grep org.springframework | cut -c 25- 

El comando corte eliminaría los primeros 25 caracteres de cada línea para mí si se pudiera conseguir la entrada de grep! (Funciona como se esperaba si elimino 'grep' de la cadena.)

Estoy usando cygwin con bash.

Resultados reales: Cuando agrego la segunda tubería para conectarme al comando 'cortar', el resultado es que se cuelga, como si estuviera esperando la entrada (en caso de que se lo pregunte).

+0

Si paro después de grep (sin el tubo de 'corte') , funciona (sin quitar los primeros 24 o 25 caracteres). – les2

+0

El verdadero problema aquí, es que 'tail -f' nunca termina, por lo que el resto de la tubería sigue esperando más entrada – Hasturkun

Respuesta

10

En mi sistema, aproximadamente 8K se almacenó en el búfer antes de que obtuviera ninguna salida. Esta secuencia trabajó para seguir el archivo inmediatamente:

tail -f logfile | while read line ; do echo "$line"| grep 'org.springframework'|cut -c 25- ; done 
+0

acabo de volver a esto y este trabajó – les2

-1

Lo que tiene que funcionar bien, esa es la idea de las tuberías. El único problema que veo es que, en la versión de cut que tengo (GNU coreutiles 6.10), debe usar la sintaxis cut -c 25- (es decir, usar un signo menos en lugar de un signo más) para eliminar los primeros 24 caracteres.

También está buscando diferentes patrones en sus dos ejemplos, en caso de que sea relevante.

+0

¡Uy! Estoy usando el signo 'menos' - que era un error tipográfico en mi publicación aquí – les2

29

Suponiendo grep de GNU, añadir --line-buffered a la línea de comandos, por ejemplo.

tail -f logfile | grep --line-buffered org.springframework | cut -c 25- 

Editar:

veo búfer grep no es el único problema aquí, como corte no permite el almacenamiento en búfer linewise.

es posible que desee para tratar de reemplazarlo con algo que se puede controlar, tales como sed:

tail -f logfile | sed -u -n -e '/org\.springframework/ s/\(.\{0,25\}\).*$/\1/p' 

o awk

tail -f logfile | awk '/org\.springframework/ {print substr($0, 0, 25);fflush("")}' 
+1

- buffer de línea no funcionó para mí - que almacena el * output * de grep. Si haces tail -f logfile | cut -c 25-, solo queda ahí. El almacenamiento en búfer se realiza en la salida de la cola. –

+0

Revisado, parece que está siendo mordido por el almacenamiento en búfer de stdout en corte, estos deberían funcionar para usted – Hasturkun

+0

¡Gracias! esto es realmente útil cuando se encadenan múltiples greps. p.ej. someprogwithoutput | grep - patrón de filtro con buffer de línea | grep --color highlightpattern – Superole

Cuestiones relacionadas