Você pode usar awk
para isso:
$ awk -F'[]]|[[]' \
'$0 ~ /^\[/ && $2 >= "2014-04-07 23:00" { p=1 }
$0 ~ /^\[/ && $2 >= "2014-04-08 02:00" { p=0 }
p { print $0 }' log
Onde:
-
-F
especifica os caracteres[
e]
como separadores de campo usando uma expressão regular -
$0
faz referência a uma linha completa -
$2
faz referência ao campo de data -
p
é usado como variável booleana que protege a impressão real -
$0 ~ /regex/
é verdadeiro se a regex corresponder a$0
-
>=
é usado para comparar lexicograficamente string (equivalente a, por exemplo,strcmp()
)
Variações
A linha de comando acima implementa a correspondência intervalo de tempo correto . Para obter a semântica do intervalo fechado, basta incrementar sua data correta, por exemplo:
$ 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
Caso você deseje corresponder registros de data e hora em outro formato, é necessário modificar a sub-expressão $0 ~ /^\[/
. Observe que é usado para ignorar linhas sem nenhum registro de data e hora da lógica de ativação / desativação da impressão.
Por exemplo, para um formato de registro de data e hora como YYYY-MM-DD HH24:MI:SS
(sem []
chaves), você poderia modificar o comando da seguinte maneira:
$ 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
(note que também o separador de campo é alterado - para transição em branco / não em branco, o padrão)