
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 %T
opció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.