Me gustaría seguir un archivo, pero solo las líneas de salida que tienen una cadena determinada. es posible?
Me gustaría seguir un archivo, pero solo las líneas de salida que tienen una cadena determinada. es posible?
Respuestas:
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 |).
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í.
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 -2
omitirá la primera línea.
grep
se 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-buffered
opció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.)