Puedes usar awkpara esto:
$ awk -F'[]]|[[]' \
'$0 ~ /^\[/ && $2 >= "2014-04-07 23:00" { p=1 }
$0 ~ /^\[/ && $2 >= "2014-04-08 02:00" { p=0 }
p { print $0 }' log
Dónde:
-Fespecifica los caracteres [y ]como separadores de campo utilizando una expresión regular
$0 hace referencia a una línea completa
$2 hace referencia al campo de fecha
p se utiliza como variable booleana que protege la impresión real
$0 ~ /regex/ es cierto si la expresión regular coincide $0
>=se usa para comparar cadenas lexicográficamente (equivalente a, por ejemplo strcmp())
Variaciones
La línea de comando anterior implementa la coincidencia de intervalo de tiempo de apertura a la derecha . Para obtener una semántica de intervalo cerrado, simplemente incremente su fecha correcta, por ejemplo:
$ awk -F'[]]|[[]' \
'$0 ~ /^\[/ && $2 >= "2014-04-07 23:00" { p=1 }
$0 ~ /^\[/ && $2 >= "2014-04-08 02:00:01" { p=0 }
p { print $0 }' log
En caso de que desee hacer coincidir las marcas de tiempo en otro formato, debe modificar la $0 ~ /^\[/expresión secundaria. Tenga en cuenta que solía ignorar líneas sin ninguna marca de tiempo de la lógica de encendido / apagado de impresión.
Por ejemplo, para un formato de marca de tiempo como YYYY-MM-DD HH24:MI:SS(sin []llaves), puede modificar el comando de esta manera:
$ awk \
'$0 ~ /^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-2][0-9]:[0-5][0-9]:[0-5][0-9]/
{
if ($1" "$2 >= "2014-04-07 23:00") p=1;
if ($1" "$2 >= "2014-04-08 02:00:01") p=0;
}
p { print $0 }' log
(tenga en cuenta que también se cambia el separador de campo - a transición en blanco / no en blanco, el valor predeterminado)
date -dcomando y usándola para construir el patrón de búsqueda.