Você quase tem isso.
Passo 1
No GNU e no Linux e talvez em outros sistemas, o comando date
pode ser usado para imprimir um formato arbitrário para uma especificação de tempo, dada uma expressão de tempo fácil de usar. Por exemplo, posso obter uma string representando o tempo de 15 minutos no passado usando isto:
date --date='15 minutes ago'
Você praticamente fez isso com seu código, embora com menos eficiência. Mas você deixou de fora os microssegundos. Presumivelmente, você não se importa com eles, mas precisa combiná-los. O fuso horário pode ser feito com '%: z', mas presumivelmente, você precisa coincidir com o fuso horário existente; as coisas podem quebrar logo após o horário de verão mudar. Se você tiver que se preocupar com vários fusos horários, precisará de um regex ou da solução do Sobrique. Emptor de advertência, você provavelmente poderia se safar:
NOW=$(date +"%FT%T.000%-04:00")
T2=$(date --date='15 minutes ago' +"%FT%T.000%-04:00")
Etapa 2
Você pode usar seu NOW e T2 como entradas para awk
. A correspondência baseada em strings funcionará muito bem aqui, mas o awk permite que você se certifique de que cada linha se encaixe no intervalo de tempo necessário fazendo comparações de cadeia maior que e menor que.
awk -v TSTART="[$T2]" -v TEND="[$NOW]" '$1>=TSTART && $1<=TEND'
Etapa 3 (NOVO)
Você precisa obter as linhas de log sem timestamp entre as linhas com registro de data e hora. Portanto, usamos o código awk acima para corresponder às linhas de timestamp e, quando o timestamp estiver no intervalo correto, definir um sinalizador. Somente quando o sinalizador é definido como 1, a linha atual é impressa.
awk -v TSTART="[$T2]" -v TEND="[$NOW]" \
'/^\[[^ ]*\] / { log = ($1>=TSTART && $1<=TEND) } log { print }'
Etapa 4
Como de costume, redirecione a saída, mas você deve observar que, se estiver executando o script a cada 15 minutos, seu código de redirecionamento atual substituirá o mesmo arquivo porque% H não será alterado em pelo menos três dessas execuções. Melhor torná-lo% H-% M ou algo assim. Mas não há necessidade de nenhum redirecionamento para o arquivo. Você pode enviá-lo diretamente para o correio (a menos que você realmente precise do anexo):
{
echo "$MESSAGE"; echo
awk -v TSTART="[$T2]" -v TEND="[$NOW]" '$1>=TSTART && $1<=TEND' $LogDir/oim_server1-diagnostic.log
} | mailx -S smtp="$SMTP" -r "$SENDER" -s "$SUBJECT" "$EMAIL1"
O resto do seu script deve funcionar como está.
No entanto, na configuração acima, agora você não recebe um anexo que pode ser salvo facilmente com o registro de data e hora relevante. E talvez você não queira enviar mensagens se não houver saída. Então você poderia fazer algo assim:
OUT=/tmp/oim_server1-diagnostic_$(date +%F-%H-%M)
awk -v TSTART="[$T2]" -v TEND="[$NOW]" '$1>=TSTART && $1<=TEND' $LogDir/oim_server1-diagnostic.log > "$OUT"
test -s $OUT &&
echo -e "$MESSAGE" | mailx -S smtp="$SMTP" -a "$OUT" -r "$SENDER" -s "$SUBJECT" "$EMAIL1"
rm -f "$OUT"
Isso limpa depois de si mesmo, para que você não tenha muitos arquivos de log de diagnóstico por aí.