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).
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.
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ó.
^[^ ]+
parte ..¿Por qué molestarse en usar grep? Simplemente puedes usar sed.
ejemplo:
Esto imprimirá todos los registros entre
June 17 13:39:54
yJune 18 10:50:28
fuente
En realidad, hay una manera mucho más fácil de hacer esto.
Descarga / Documentación: autodrgrep.kl.sh
Mando:
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:
¿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ó.
fuente