Mostrar líneas en los últimos 10 minutos con un patrón específico en los registros

Mostrar líneas en los últimos 10 minutos con un patrón específico en los registros

Necesito mostrar líneas con Error ocurrido en los últimos 10 minutos de un archivo de registro.

Aug 26 10:50:42 Normal line.
Aug 26 10:51:23 Normal line.
Aug 26 10:55:33 Error line.
Aug 26 10:56:45 Normal line.
Aug 26 10:58:12 Error line.
Aug 26 11:02:31 Normal line.
Aug 26 11:03:32 Normal line.
Aug 26 11:04:11 Normal line.

Supongamos el ejemplo anterior de archivo de registro. Quiero mostrar solo las siguientes dos líneas.

Aug 26 10:55:33 Error line.
Aug 26 10:58:12 Error line.

Estoy usando AIX.

Respuesta1

Con un saludo a Stéphane Chazelas por sus dos respuestas aquí:

Propongo una solución de fuerza bruta que recorre cada entrada posible de marca de tiempo durante los últimos 10 minutos:

#!/bin/ksh93
for((i=0;i<=600;i++))
do
  d=$(printf '%(%b %d %H:%M:%S)T\n' "$i seconds ago")
  grep "^${d} Error" logfile
done

Es de fuerza bruta porque llama grep(y printf, una función incorporada) 601 veces. Requiere un ksh93 que admita la %Topción printf para imprimir (y formatear) marcas de tiempo arbitrarias. Sin embargo, es más fácil que hacer cálculos de fechas por tu cuenta debido a casos extremos como:

  • límites del día
  • límites del mes
  • posibles cambios de horario de verano

Respuesta2

Una posibilidad aquí, estafando descaradamente la solución de @Jeff Schaller. Invocación única de grep, por lo que quizás sea un poco más rápido.

#!/bin/ksh93
for((i=0;i<=600;i++))
do
  d=$(printf '%s|%(%b %d %H:%M:%S)T' "${d}" "${i} seconds ago")
done
grep -E "^(${d:1}) Error" logfile

Respuesta3

Gracias por todas sus respuestas. Hice el trabajo requerido con el siguiente comando.

awk -v d1="$d1" -v d2="$d2" '$0 > d1 && $0 < d2 || $0 ~ d2' logfile

donde d1 y d2 se inicializaron arriba. Hizo el trabajo por mí.

Salud.

Respuesta4

Si necesita obtener líneas de los últimos 10 minutos cada 10 minutos, puede utilizar elcortar el registroherramienta que permite imprimir una parte final invisible de un archivo de registro. Primero guarda la posición del archivo mediante comando.

$ cutthelog logfile > /dev/null

luego procese el registro mediante trabajo cron, por ejemplo

*/10 * * * * root cutthelog logfile | grep 'Error line' | ..."

Como beneficio adicional, te librarás de leer el registro completo de cada cheque.

información relacionada