Estoy tratando de ver cuántas veces foo bar
aparece /var/log/foo.log
dentro de un tiempo arbitrario en un servidor remoto, pero nada de lo que he intentado hasta ahora ha funcionado.
Ya tengo un script de temporizador que uso para hacer un seguimiento de cuánto tiempo ha pasado desde que comencé a seguir /var/log/foo.log
, y ahora me gustaría una forma de saber cuántas veces foo bar
ha aparecido en la salida de cola.
Busqué en google, pero no encontré nada pertinente en las primeras 10 páginas de resultados.
Esto es lo que he probado con resultados frustrantes:
## works on local machine, but doesn't work as expected on remote
tail -f /var/log/foo.log | grep foo\ bar | sed '='
## works on local, but not remote
tail -f /var/log/foo.log | grep foo\ bar | cat -n -
## works on local, but not remote
tail -f /var/log/foo.log | grep foo\ bar | awk -F'\n' '{printf "[%d]> ", NR; print $1}'
Incluso intenté escribir una secuencia de comandos sed que actuara como tail -f
, pero logré un avance limitado o nulo con eso.
NOTA
el servidor remoto ejecuta una versión anterior de coreutils, y la actualización es una opción, pero NO es de ninguna manera la solución deseada.
fuente
--line-buffered
opción degrep
. Otail -f ... | awk '/foo bar/{print ++n, $0}'
tail -f /var/log/log.log | awk '{ printf "[%d]> %s\n", NR+1 ,$0; fflush(stdout); }'
Respuestas:
funciona para mí y es lo primero en lo que pensé, es decir, si realmente quieres que las líneas estén numeradas del 1 y no con el número de línea real del archivo visto. Opcionalmente agregue
grep
si es necesario al lugar apropiado (antes o despuésnl
). Sin embargo, recuerde que puede ocurrir el almacenamiento en búfer. En mi caso particular,grep
tiene la--line-buffered
opción, peronl
amortigua su salida y no tiene una opción para desactivarla. Por lo tanto, eltail | nl | grep
combo realmente no fluye bien.Dicho eso
A mí también me funciona. La numeración comienza nuevamente desde el comienzo de la "recopilación" en lugar del comienzo de todo el archivo de registro.
fuente
-n
opción.--line-number
:tail -f /var/log/foo.log | grep foo\ bar --line-number
¡funciona!Creo que esto es mejor..
fuente
También puede canalizar la salida a
less
, tiene una función de número de línea,-N
que le permitiría desplazarse hacia adelante y hacia atrás a través del registro.Ejemplo
NOTA: tome nota de la salida. Puede que le guste o no esta característica, pero tomará largas líneas y las cortará para que continúen en la siguiente línea, pero aún así mantengan el mismo número de línea correspondiente. ¡Encuentro esta característica invaluable al analizar archivos de registro que son anchos! Puede ver el efecto de esta función en las líneas 6 y 8 .
fuente
tail
. En cuanto a las líneas largas, ese comportamiento se alterna dentro delless
uso-S
.Para agrupar nuevas líneas solo en el archivo de registro, ya que vienen con su número de línea, puede hacer lo siguiente:
(con
mawk
, querrás agregar la-Winteractive
opción para evitar el almacenamiento en búfer de entrada (!)).wc -l
lee las líneas que ya estaban allí y las cuenta (los caracteres de la nueva línea, lo que significa que aún funciona, incluso si la última línea aún no está llena), y luegotail -f
el resto (comenzando desde dondewc
dejó de leer) y decimosawk
cuál es el número de línea de El primero que ve.fuente
l
como el nombre de la variable me hizo entrecerrar los ojos en $ l, pensando que era$1
^^ (pero como sé (y 100% de confianza) en ti, volví a leer y vi la verdad). Solo por curiosidad: para evitar alguna "condición de carrera" entre elwc -l
y eltail -f
(si el archivo crece rápido, uno puede descartar algunas líneas y, por lo tanto, el NR comienza desde el número incorrecto), ¿es posible omitir$l
líneas en su lugar? (¿y qué límite hay para la cola-n
en posix y en gnu?). Tal vez con un archivo intermedio temporal?tail -n +1
(lea cualquier cosa desde la posición de inicio) aborda las preocupaciones de la condición de carrera. Leerá las líneas que no estaban en el archivo en el momentowc -l
finalizado, desde la posición exacta a lawc
izquierda. Por lo tanto, NR tendrá la posición correcta independientemente de cuántas líneas se hayan escrito entre elwc
final y eltail
inicio. Si tuviera quetail
comenzar desde una posición relativa al final del archivo, tendría problemas.tail -n +1
aquí), para los archivos normales, la mayoría de las implementaciones no tienen una, ya que pueden comenzar desde el final yseek
volver hasta encontrar la enésima nueva línea sin tener que almacenar más de un valor de buf de datos en la memoria. Para la entrada no buscable, ahí es donde puede toparse con límites. POSIX requiere implementaciones para poder almacenar al menos 10 x LINE_MAX bytes (LINE_MAX es al menos 2048). La cola de GNU no tiene otro límite que la memoria AFAIKSi quisiera numerar desde el principio, necesitaría grep -n para aplicar a todas las líneas.
Si solo quisiera mostrar los últimos 10, hubiera pensado que podría volver a ajustar el archivo:
El primero es útil, pero muestra demasiada salida. No sé por qué el segundo no funciona.
fuente
tail -n +1 -f
a la cola desde el principio.tail
no puede generar nada hasta que haya visto la última línea de su entrada (¿cómo sabría cuál es la décima última línea?), Que nunca sucederá, ya quetail -f
nunca se detiene.El comando
cat -n [filename] | tail
obtendrá un recuento rápido y una visualización de los registros más recientes si eso es lo que está buscando.El
-f
interruptor lo hace persistente hasta el escape, lo que realmente no parece aplicable en su escenario o es redundante.wc -l [filename]
obtendrá un recuento de las líneas en el objetivowc -l [filenameprefix]*
contará todas las líneas en todos los archivos que coincidan con el patrón e incluso informará un resumen total al final.Un detalle más completo puede dar respuestas más completas.
fuente
Es el argumento
n
o--lines
(usado de maneras ligeramente diferentes, ver abajo):Ver también la ayuda:
fuente