En tail -f, ¿cómo filtro cosas que tienen ciertas palabras clave?

Respuestas:

58

No sé sobre el uso de awk en lugar de grep, pero esto funciona para mí:

tail -f file.log | grep -Ev '(ELB|Pingdom|Health)'

EDITAR: Como señalaron dmourati y Caleb , también podría usarlo en egreplugar de grep -Epor conveniencia. En algunos sistemas, esto será un enlace al mismo binario, en otros, una copia del paquete grep. De cualquier manera, vive como una alternativa al -Ecambio. Sin embargo, de acuerdo con la página de manual de GNU grep:

[…] Dos programas variantes egrepy fgrepestán disponibles. egrepes el mismo que grep -E. fgrepes el mismo que grep -F. La invocación directa como egrepo fgrepestá en desuso, pero se proporciona para permitir que las aplicaciones históricas que se basan en ellas se ejecuten sin modificaciones.

Dado que son comandos sinónimos, todo se reduce a preferencia a menos que no tenga egrep en absoluto. Sin embargo, para la compatibilidad con versiones anteriores, se recomienda utilizar la grep -Esintaxis ya que el otro método está oficialmente en desuso.

DTest
fuente
¿Usar en grep -Elugar de egrepgarantizar una respuesta duplicada?
Caleb
@Caleb No veo por qué no. Hay más de una forma de desollar a un gato, y este sitio permite la lista de todos
DTest
1
Sí, pero son simplemente enlaces simbólicos entre sí, no dos programas diferentes con cierta superposición funcional. Entonces, ¿no sería eso más un 'apéndice' (leer: comentario), no una respuesta completa? He tenido votos negativos por delitos menores ...
Marcin
@DTest: Por derecho, dmourati realmente me ganó por un par de segundos y, aunque no explicó el razonamiento, merece algo de crédito aquí. Llegaste claramente a la fiesta, ya que ambos tuvimos al menos dos votos a favor antes de entrar. Cambiar la sintaxis de un binario vinculado a un argumento generalmente es algo para lo que usarías un comentario, no una respuesta por separado. Si desea la piel del gato diferente utiliza sed, awk, perl, multitailo ninja_foo.
Caleb
1
@DTest: Me tomé la libertad de hacer una edición de hechos significativa a su respuesta para agregar algunas fuentes originales. Parece que se recomienda -E para uso futuro, así que lo marqué, pero eliminé su nota sobre las distribuciones que no tienen egrep. Las distribuciones mencionadas anteriormente tienen egrep, es solo un binario separado en lugar de un enlace simbólico.
Caleb
21

Intente canalizarlo a egrep con una lista de palabras separadas por tuberías que desee filtrar:

tail -f log_file | egrep -v 'ELB|Pingdom|Health'

Tenga en cuenta que usar paréntesis alrededor de la lista de coincidencias es opcional. Como |grep trata el operador OR lógico, ya sea que ocurra como parte de un subgrupo o no. '(ELB|Pingdom|Health)'funcionaría exactamente igual. Para algunos, la sintaxis puede ser más obvia; Me resulta más fácil escribir sin él, ya que puedo cambiar de una sola coincidencia a una lista de posibles coincidencias sin volver a agregar el paréntesis.

Para obtener un crédito adicional, vale la pena mencionar que multitailhace ninja foo cuando se trata de filtrar resultados. Por ejemplo, podría filtrar sus palabras de esta manera:

multitail -e ELB -e Pingdom -e Health -f log_file

También puede usarlo para colorear o resaltar el resultado en lugar de simplemente filtrarlo.

EDITAR: Vea la respuesta de DTests y los comentarios para obtener una explicación completa de cómo egrep es solo una forma alternativa desaprobada de disparar grep -E.

Caleb
fuente
2
¿No debería terminar la expresión con ('), no con (")?
bbaja42
Sí, gracias, fue un error tipográfico. Para futuras referencias, ya que los sitios de intercambio de pila funcionan como wikis, ese es el tipo de cosas que puede solucionar.
Caleb
¿Pensé que la edición tenía que ser más de 6 caracteres?
Sirex
Si no tiene una alta repetición, sí, hay un mínimo de 6 caracteres, pero en este caso el 1 carácter es súper importante. Puede forzar el cambio agregando un comentario HTML al cuerpo. Los personajes contarán hacia el límite y puedes notar por qué estás haciendo el cambio.
Caleb
@Caleb muchas gracias por la sugerencia multitail, ¡es increíble ! No puedo creer que haya pasado tanto tiempo en mi vida sin eso.
sidewinderguy
5
tail -f /path/to/log | egrep -v 'ELB|Pingdom|Health'
dmourati
fuente
3

¿Por qué quieres registrar esta información?

  • ¿Es estrictamente para el archivo?
  • ¿Desea ejecutar condicionalmente diferentes scripts dependiendo de diferentes palabras clave o patrones en los archivos de registro?

Si desea tener un comportamiento programado según el contenido de los archivos de registro, es posible que desee realizar el filtrado con Expect. ( http://en.wikipedia.org/wiki/Expect ) Expect es una extensión Tcl pero también hay una versión de Expect en Python.

Expect le brinda este poderoso interruptor flexible como declaración que le permite especificar diferentes comportamientos condicionalmente dependiendo de los estados o patrones presentes en su flujo de entrada. Por ejemplo:

expect {  
    "password:" {  
        send "password\r"  
    } 
    "yes/no)?" {  
        send "yes\r"  
        set timeout -1  
    }  
    timeout {  
        exit  
    }   
    -re . {  
        exp_continue  
    }  
    eof {  
        exit  
    }  
}

Por lo tanto, especifica patrones en la declaración de espera, y especifica diferentes comportamientos, y puede envolver todo en un bucle, y puede escribir fácilmente filtros muy potentes que también escriben porciones de su entrada en diferentes archivos, o soltarlo por completo, o tome medidas y ejecute otros scripts según lo que haya en su entrada.

Entonces, todo se reduce a por qué está tratando de filtrar sus archivos de registro, tomar medidas en la entrada del registro o simplemente por razones de archivo.

Jerry Asher
fuente
Más uno para la referencia a Expect, que utilicé hace mucho tiempo y que había olvidado por completo.
MPi