¿Cómo filtrar registros fácilmente con awk?

Supongamos que tengo un archivo de registromylog Me gusta esto:

[01/Oct/2015:16:12:56 +0200] error number 1
[01/Oct/2015:17:12:56 +0200] error number 2
[01/Oct/2015:18:07:56 +0200] error number 3
[01/Oct/2015:18:12:56 +0200] error number 4
[02/Oct/2015:16:12:56 +0200] error number 5
[10/Oct/2015:16:12:58 +0200] error number 6
[10/Oct/2015:16:13:00 +0200] error number 7
[01/Nov/2015:00:10:00 +0200] error number 8
[01/Nov/2015:01:02:00 +0200] error number 9
[01/Jan/2016:01:02:00 +0200] error number 10

Y quiero encontrar esas líneas que ocurren entre el 1 de octubre a las 18.00 y el 1 de noviembre a la 1.00. Es decir, el resultado esperado sería:

[01/Oct/2015:18:07:56 +0200] error number 3
[01/Oct/2015:18:12:56 +0200] error number 4
[02/Oct/2015:16:12:56 +0200] error number 5
[10/Oct/2015:16:12:58 +0200] error number 6
[10/Oct/2015:16:13:00 +0200] error number 7
[01/Nov/2015:00:10:00 +0200] error number 8

He logrado convertir los tiempos en marca de tiempo usandomatch() y entoncesmktime(). Primero se encuentra el patrón especificado, que se almacena en la matriza[] para que se pueda acceder (interesante ver la respuesta de Glenn Jackman aacceder al grupo capturado desde el patrón de línea para un buen ejemplo) Ya quemktime requiere un formatoYYYY MM DD HH MM SS[ DST], También tengo que convertir el mes en el formularioXxx en un dígito, para lo cual usouna respuesta de Ed Morton para "convertir el mes de Aaa a xx": awk '{printf "%02d\n",(match("JanFebMarAprMayJunJulAugSepOctNovDec",$0)+2)/3}'.

Todos juntos, finalmente tengo la marca de tiempo en la variablemytimestamp:

awk 'match($0, /([0-9]+)\/([A-Z][a-z]{2})\/([0-9]{4}):([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2}) ([+-][0-9]{4})/, a) {
        day=a[1]; month=a[2]; year=a[3];
        hour=a[4]; min=a[5]; sec=a[6]; utc=a[7];
        month=sprintf("%02d",(match("JanFebMarAprMayJunJulAugSepOctNovDec",month)+2)/3);
        mydate=sprintf("%s %s %s %s %s %s %s", year,month,day,hour,min,sec,utc);
        mytimestamp=mktime(mydate)
        print mytimestamp
    }' mylog

Devoluciones:

1443708776
1443712376
1443715676

etc.

Así que ahora estoy listo para convertir contra las fechas dadas. Ya queawk toma mucho para manejar dicho formato, prefiero proporcionarlos a través de una variable de shell externa, usandodate -d"my date" +"%s" para imprimir la marca de tiempo:

start="$(date -d"1 Oct 2015 18:00 +0200" +"%s")"
end="$(date -d"1 Nov 2015 01:00 +0200" +"%s")"

Todos juntos, esto funciona:

awk start="$(date -d"1 Oct 2015 18:00 +0200" +"%s")" end="$(date -d"1 Nov 2015 01:00 +0200" +"%s")" 'match($0, /([0-9]+)\/([A-Z][a-z]{2})\/([0-9]{4}):([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2}) ([+-][0-9]{4})/, a) {day=a[1]; month=a[2]; year=a[3]; hour=a[4]; min=a[5]; sec=a[6]; utc=a[7]; month=sprintf("%02d",(match("JanFebMarAprMayJunJulAugSepOctNovDec",month)+2)/3); mydate=sprintf("%s %s %s %s %s %s %s", year,month,day,hour,min,sec,utc); mytimestamp=mktime(mydate); if (start<=mytimestamp && mytimestamp<=end) print}' mylog
[01/Oct/2015:18:07:56 +0200] error number 3
[01/Oct/2015:18:12:56 +0200] error number 4
[02/Oct/2015:16:12:56 +0200] error number 5
[10/Oct/2015:16:12:58 +0200] error number 6
[10/Oct/2015:16:13:00 +0200] error number 7
[01/Nov/2015:00:10:00 +0200] error number 8

Sin embargo, esto parece ser bastante trabajo para algo que debería ser más sencillo. No obstante, la introducción de la sección "Funciones de tiempo" enman gawk es

Dado que uno de los usos principales de los programas AWK es procesar archivos de registro que contienen información de marca de tiempo, gawk proporciona las siguientes funciones para obtener marcas de tiempo y formatearlas.

Entonces me pregunto: ¿hay alguna manera mejor de hacer esto? Por ejemplo, ¿qué pasa si el formato en lugar dedd/Mmm/YYYY:HH:MM:ss era algo comodd Mmm YYYY HH:MM:ss? ¿No podría ser posible proporcionar el patrón de coincidencia externamente en lugar de tener que cambiarlo cada vez que esto suceda? ¿Realmente tengo que usarmatch() y luego procesar esa salida para luego alimentarmktime()? Nogawk ¿Proporciona una manera más simple de hacer esto?

Respuestas a la pregunta(3)

Su respuesta a la pregunta