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

22

Tengo un archivo de registro, cada línea en el registro está precedida por una fecha, así:

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

¿Cómo hago grepeste archivo y obtengo solo las líneas de 8am a 11pm solamente?

Mi intención es contar el número de errores que ocurren entre las 8 a.m. y las 11 p.m.

Rosdi
fuente

Respuestas:

24
egrep '^[^ ]+ (0[89]|1[0-9]|2[012]):'

Explicación detallada se puede encontrar en diversas expresiones regulares tutoriales (expresiones regulares); egreputiliza la sintaxis "POSIX extendida" ( man 7 regex).

  • El primero ^significa "inicio de la línea".

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

    • [...]significa "cualquier carácter entre paréntesis", por [89]lo que coincidirá con 8o 9; [0-9]es cualquier número y [^ ]es cualquier cosa menos un espacio (debido a los ^corchetes internos).

    • +significa "uno o más de los anteriores" (por ejemplo, a+se correspondería a, aaay aaaaaaaa).

    • Entonces ^[^ ]+comenzará con el comienzo de la línea y unirá tantos caracteres no espaciales como sea posible.

  • (...|...|...)medios "cualquiera de los patrones dados", por lo que (0[89]|1[0-9]|2[012])los medios "ya sea 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 -Fopción divide cada línea en campos separados de acuerdo con la [: ]expresión regular (que coincida con :un espacio), y el script awk verifica la segunda columna (la hora).

Gravedad
fuente
Hola, funciona ... pero ¿puedes agregar una pequeña explicación de cómo funciona? No entiendo la ^[^ ]+parte ..
Rosdi
20

¿Por qué molestarse en usar grep? Simplemente puedes usar 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:54yJune 18 10:50:28

Nima G
fuente
1
Creo que el OP quiere todos los registros entre las 8 a.m. y las 11 p.m., pero solo los de un día específico.
Dennis
1
Él puede hacer eso también. Por ejemplo: sed -n '/ 2012-3-06 11:34:48 /, / 2012-3-06 16: 34: 48 / p' logfile.name
Nima G
1
Error tipográfico desagradable. Quise decir: no los de un día específico.
Dennis
2
El problema con este enfoque es que tiene que haber una línea en el archivo de registro con esa marca de tiempo. En el ejemplo anterior, si no hay una línea con la marca de tiempo 2012-03-06 11:34:48, no se imprimirá nada. El enfoque awk anterior funcionaría para tales casos (es decir, desea todos los registros con una hora entre 8 y 11, pero no sabe si hay una entrada de registro en el momento 2012-03-06 08:00:00 o algo para eso hora en absoluto).
user650654
0

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

Descarga / Documentación: autodrgrep.kl.sh

Mando:

./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 decirle qué 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 fechas desde el registro que desea escanear

  • "INFO" es una de las cadenas que se encuentra en las líneas de registros 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 desea mucho más rápido, especialmente si se trata de un archivo de registro enorme.

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

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

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

Ejecución de muestra:

# ./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é sucede si el intervalo 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 (última línea de la salida) que dice "ATWFILF" o "ETWNFILF".

  • ATWFILF significa que el intervalo de fechas o el marco de tiempo real que solicitó buscado se encontró en el registro. Entonces esto es muy bueno.

  • ETWNFILF significa que el intervalo de fechas o el marco de tiempo real que solicitó buscar NO se encontró en el registro. En este caso, se detectará y utilizará en su lugar el tiempo más cercano al tiempo que especificó.

Trabajo simplificado
fuente