Estoy tratando de ver cuántas veces foo baraparece /var/log/foo.logdentro 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 barha 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-bufferedopció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
grepsi es necesario al lugar apropiado (antes o despuésnl). Sin embargo, recuerde que puede ocurrir el almacenamiento en búfer. En mi caso particular,greptiene la--line-bufferedopción, peronlamortigua su salida y no tiene una opción para desactivarla. Por lo tanto, eltail | nl | grepcombo 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
-nopció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,-Nque 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 dellessuso-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-Winteractiveopción para evitar el almacenamiento en búfer de entrada (!)).wc -llee 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 -fel resto (comenzando desde dondewcdejó de leer) y decimosawkcuál es el número de línea de El primero que ve.fuente
lcomo 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 -ly 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$llíneas en su lugar? (¿y qué límite hay para la cola-nen 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 -lfinalizado, desde la posición exacta a lawcizquierda. Por lo tanto, NR tendrá la posición correcta independientemente de cuántas líneas se hayan escrito entre elwcfinal y eltailinicio. Si tuviera quetailcomenzar desde una posición relativa al final del archivo, tendría problemas.tail -n +1aquí), para los archivos normales, la mayoría de las implementaciones no tienen una, ya que pueden comenzar desde el final yseekvolver 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 -fa la cola desde el principio.tailno 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 -fnunca se detiene.El comando
cat -n [filename] | tailobtendrá un recuento rápido y una visualización de los registros más recientes si eso es lo que está buscando.El
-finterruptor 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
no--lines(usado de maneras ligeramente diferentes, ver abajo):Ver también la ayuda:
fuente