¿Es posible filtrar la salida de cola?

11

Me gustaría seguir un archivo, pero solo las líneas de salida que tienen una cadena determinada. es posible?

Abe Miessler
fuente

Respuestas:

32

usa grep. Está construido solo para ese propósito.

Para buscar líneas de una cola de / var / log / syslog que tengan "cron" en ellas, simplemente ejecute:

tail -f /var/log/syslog | grep cron

Y dado que acepta cualquier cosa sobre stdin, también puede usarlo en la salida de cualquier otro comando, canalizando de la misma manera que antes (usando el símbolo |).

Ryan H
fuente
8
Si bien esto es esencialmente correcto, es importante darse cuenta de que grepse amortiguará cuando se use de forma no interactiva, como cuando es parte de una tubería más larga. GNU grep 2.5.1 ofrece la --line-bufferedopción de evitar esto cuando eliminar grep de la tubería no es una opción. (Cuando digo que grep almacenará en búfer, quiero decir que no verá salida hasta que el búfer haya alcanzado algo así como 4k.)
kojiro
Para complementar el comentario anterior, "tail -f" en Linux moderno funcionará en un bucle, esperando más entradas en el archivo syslog. Para que el comando realmente termine con el contenido existente en el archivo, omita el modificador -f: tail / var / log / syslog | grep cron
Gnudiff
7
tail -f /var/log/messages | grep "myfilterword"

Espero que ayude.

pablo
fuente
4

Aquí hay otras ideas que, aunque no son tan simples, pueden ofrecer una flexibilidad adicional interesante:

Primero, puede filtrar con awk en lugar de grep:

tail -f /var/log/messages | awk '/myfilterword/'

eso funciona exactamente igual que el ejemplo usando grep. Puede ampliar esto utilizando el poder de awk, por ejemplo:

tail -f /var/log/messages | \
awk '/myfilterword/ { for (i=6; i<=NF; i++) printf("%s ", $i); printf("\n")}'

que imprimirá del sexto al último campo de la salida (los campos están separados por espacios en blanco)

Otra idea similar es usar un perl one-liner:

tail -f /var/log/messages | perl -ne "/myfilterword/ and print"

eso funciona exactamente igual grep. ¿Quizás quieres un contador de número de línea y solo el sexto campo? Qué tal esto:

tail -f /var/log/messages | \ 
perl -lane "/myfilterword/ and printf \"%6d %s\n\",++\$a,\$F[6]"

Obviamente, todo este tipo de cosas también se puede hacer con otras herramientas, pero quería ilustrar que hay algunas formas divertidas de usar lenguajes de propósito más general como awk o perl aquí.

Phil Hollenback
fuente
¡+1 gran elaboración sobre cómo expandirse más allá de grep!
pablo
2

Otro truco que vale la pena señalar, si tiene un archivo CSV con encabezados que desea omitir, por ejemplo:

% cat data.txt
fruit        dessert        calories
Apple        Pie            770
Banana       Pudding        625
Cherry       Cobbler        990
% tail -n +2 data.txt
Apple        Pie            770
Banana       Pudding        625
Cherry       Cobbler        990

No importa cuánto tiempo sea la entrada tail, +n -2omitirá la primera línea.

JeffG
fuente