2012-06-21 10:54:47 +0000 2012-06-21 10:54:47 +0000
22
22

Cómo buscar en un archivo de registro dentro de un período de tiempo específico

Tengo un archivo de registro, cada línea en el registro es prepender con una fecha, así:

2012-03-06 11:34:48,657 blah blah blah...

¿Cómo hago para grep este archivo y obtener sólo las líneas de 8am a 11pm?

Mi intención es contar el número de errores que ocurren entre las 8am y las 11pm.

回答 (3)

24
24
24
2012-06-21 11:08:20 +0000
egrep '^[^]+ (0[89]|1[0-9]|2[012]):'

Se puede encontrar una explicación detallada en varios tutoriales de regex (expresión regular); egrep utiliza la sintaxis “POSIX extendida” (man 7 regex).

  • El primer ^ significa “inicio de línea”.

  • [^]+ sólo coincide con el campo de la fecha, independientemente de la fecha real.

  • (...|...|...) significa “cualquiera de los patrones dados”, así que (0[89]|1[0-9]|2[012]) significa “o 0[89] o 1[0-9] o 2[012]”. Coincidirá con todos los números del 08 al 22.


Una opción algo mejor es:

awk -F'[:]' '$2 >= 8 && $2 <= 22 { print }'

La opción -F divide cada línea en campos separados según la regex [:] (coincidiendo con : o con un espacio), y el script awk comprueba la 2ª columna (la hora).

21
21
21
2012-06-21 11:11:02 +0000

¿Por qué molestarse en usar grep? Puede utilizar simplemente sed.

ejemplo:

sed -n '/Jun 17 13:39:54/ , /Jun 18 10:50:28/p' kern.log

Esto imprimirá todos los registros entre June 17 13:39:54 y June 18 10:50:28

0
0
0
2016-05-09 06:43:49 +0000

En realidad hay una manera mucho más fácil de hacer esto.

Descarga/Documentación: autodrgrep.kl.sh

Comando:

./autodrgrep.kl.sh notchef /tmp/client.log '2016-05-08_08:00:00,2016-05-08_23:00:00' 'INFO' 'a2ensite' 5 10 -show

Explicación:

  • autodrgrep.kl.sh es el nombre de la herramienta.

  • notchef es una opción que se pasa a la herramienta para indicarle lo que debe hacer. En este caso particular, le dice a la herramienta qué tipo de archivo de registro es /tmp/client.log.

  • /tmp/client.log es, por supuesto, el archivo de registro.

  • 2016-05-08_19:12:00,2016-05-08_21:13:00 es el rango de fecha dentro del log que se desea escanear

  • “INFO” es una de las cadenas que está en las líneas de logs que le interesan.

  • “a2ensite” es otra cadena en la misma línea en la que espera encontrar la cadena “INFO”. Especificar estas dos cadenas (INFO y a2ensite) aísla y procesa las líneas que quieres mucho más rápido, particularmente si estás tratando con un archivo de registro enorme.

  • 5 especifica Advertencia. Al especificar 5, le está diciendo al programa que alerte como ADVERTENCIA si hay al menos 5 ocurrencias de las cadenas de búsqueda que especificó

  • 10 especifica Crítico. Al especificar 10, le está diciendo al programa que alerte como CRÍTICO si hay al menos 10 ocurrencias de las cadenas de búsqueda que especificó.

  • -show especifica qué tipo de respuesta obtendrá. Al especificar -shown, está diciendo que si se encuentra algo que coincida con los patrones especificados, se muestre en pantalla.

Ejecución de ejemplo:

# ./autodrgrep.kl.sh notchef /tmp/client.log '2016-05-08_19:12:00,2016-05-08_21:13:00' 'INFO' 'a2ensite' 5 10 -show

[2016-05-08 19:12:58-07:00] INFO: Processing template[/usr/sbin/a2ensite] action create (apache2::default line 90)
[2016-05-08 19:12:58-07:00] INFO: Processing execute[a2ensite default] action run (apache2::default line 24)
[2016-05-08 19:12:58-07:00] INFO: execute[a2ensite default] ran successfully
[2016-05-08 19:13:09-07:00] INFO: Processing execute[a2ensite nagios3.conf] action run (logXrayServer::install line 24)
[2016-05-08 19:13:12-07:00] INFO: execute[a2ensite default] sending restart action to service[apache2] (delayed)
[2016-05-08 19:42:57-07:00] INFO: Processing template[/usr/sbin/a2ensite] action create (apache2::default line 90)
[2016-05-08 19:42:57-07:00] INFO: Processing execute[a2ensite default] action run (apache2::default line 24)
[2016-05-08 19:42:57-07:00] INFO: execute[a2ensite default] ran successfully
[2016-05-08 19:43:08-07:00] INFO: Processing execute[a2ensite nagios3.conf] action run (logXrayServer::install line 24)
[2016-05-08 19:43:11-07:00] INFO: execute[a2ensite default] sending restart action to service[apache2] (delayed)
[2016-05-08 20:12:58-07:00] INFO: Processing template[/usr/sbin/a2ensite] action create (apache2::default line 90)
[2016-05-08 20:12:58-07:00] INFO: Processing execute[a2ensite default] action run (apache2::default line 24)
[2016-05-08 20:12:58-07:00] INFO: execute[a2ensite default] ran successfully
[2016-05-08 20:13:10-07:00] INFO: Processing execute[a2ensite nagios3.conf] action run (logXrayServer::install line 24)
[2016-05-08 20:13:12-07:00] INFO: execute[a2ensite default] sending restart action to service[apache2] (delayed)
[2016-05-08 20:42:59-07:00] INFO: Processing template[/usr/sbin/a2ensite] action create (apache2::default line 90)
[2016-05-08 20:42:59-07:00] INFO: Processing execute[a2ensite default] action run (apache2::default line 24)
[2016-05-08 20:42:59-07:00] INFO: execute[a2ensite default] ran successfully
[2016-05-08 20:43:09-07:00] INFO: Processing execute[a2ensite nagios3.conf] action run (logXrayServer::install line 24)
[2016-05-08 20:43:12-07:00] INFO: execute[a2ensite default] sending restart action to service[apache2] (delayed)
[2016-05-08 21:12:59-07:00] INFO: Processing template[/usr/sbin/a2ensite] action create (apache2::default line 90)
[2016-05-08 21:12:59-07:00] INFO: Processing execute[a2ensite default] action run (apache2::default line 24)
[2016-05-08 21:12:59-07:00] INFO: execute[a2ensite default] ran successfully
23
2---78720---23---ATWFILF---(2016-05-08)-(19:12)---(2016-05-08)-(21:13) SEAGM

¿Qué pasa si el rango de fechas o el marco de tiempo especificado por el usuario no está en el registro?

Cada ejecución del comando anterior siempre tendrá una línea (la última línea de la salida) que dice “ATWFILF” o “ETWNFILF”.

  • ATWFILF significa que el rango de fechas real o el marco de tiempo que usted solicitó buscar fue encontrado en el registro. Esto es muy bueno.

  • ETWNFILF significa que el intervalo de fechas o el marco temporal que solicitó buscar NO se encontró en el registro. En este caso, se detectará la hora más cercana a la especificada y se utilizará en su lugar.