usando awk deseja extrair logs entre dois timestamps

0

Estou tentando extrair todos os logs entre dois timestamps. Algumas linhas podem não ter o registro de data e hora, mas eu quero que essas linhas sejam incluídas - eu quero que todas as linhas que caiam sob dois timestamps sejam incluídas nos logs extraídos. os logs extraídos também devem conter as linhas 1st e last timestamp.

Observação: o carimbo de data / hora de início ou o carimbo de hora de término pode não estar presente no log, mas eu quero que todas as linhas entre esses dois registros de horário sejam extraídas.

Minha estrutura de registro de data e hora do log se parece com: 25-01-2017 07: 06: 16: 860

O comando awk que eu escrevi está buscando as linhas que contém apenas o registro de data e hora e pulando todas as outras linhas e seus logs de recuperação end_time-1, ou seja, se eu tiver dado end_time como 11:30 e seus logs de busca até 11:29 ou às vezes muito estranho menos que isso também.

PFB o comando que eu escrevi:

awk -v date=${date} \
    -v start_time=${start_time} \
    -v end_time=${end_time} \
'{if (($0 >= date FS start_time) && ($0 <= date FS end_time)) print $0; }' \
     $log.$server_name.log > $requester_email.log 

Por favor note que este comando estará dentro de um script onde eu estou pedindo ao usuário que insira os detalhes manualmente, então quando eu estiver perguntando o horário de início e fim, o usuário tem que entrar neste formato HH: MM ou seja, para o timestamp acima, o usuário digitará o horário como 07:06

Será realmente bom se alguém puder me ajudar aqui, por favor.

Exemplo de log:

25-01-2017 07:23:51:772 [DEBUG] - sdsdsadadjhadsjhasdjhajhdahdkjhadjkhasjkdhjhg asdgahdgasdhghasdghagdshdhasgadahdghasdgasd
25-01-2017 07:23:51:772 [DEBUG] - asdasd.asdasd.asdasdas.asdasd.asdasda.dfsfd.cxzzxczxczcwdqweqwe.adadsasd.asdasdasdadasdadasd.adadasdasdasd.as: adasdasdadadasdsdfsdfsdfsfssdf..<Request xmlns="adasdadasdasdasdasdasdasadadasd" xmlns:xsi="http://www.w3.org/2001/">
  <Resource>
    <Attribute AttributeId="asdasdasasdasdasdasdasdasdasdasddaasdasdasdasdaas" DataType="http://www.w3.org/2001/XMLSchema#string">
      <AttributeValue>adasdasdasdasdasddasdasd</AttributeValue>
    </Attribute>
    <!--Check something somthing-->
    <Attribute 
    AttributeId="asdasdasasdasdasdasdasdasdasdasddaasdasdasdasdaas" DataType="http://www.w3.org/2001/XMLSchema#string">
      <AttributeValue>sdasddsd</AttributeValue>
    </Attribute>
  </Subject>
  <Action>
    <Attribute AttributeId="sdfsdfsdsdfsdfsdfsdfsdfsfxcvxvxcvvxvcxvwerqwr" DataType="http://www.w3.org/2001/XMLSchema#string">
      <AttributeValue>rsf</AttributeValue>
    </Attribute>
  </Action>
</Request>
25-01-2017 07:23:51:775 [DEBUG] - sdsdsadadjhadsjhasdjhajhdahdkjhadjkhasjkdhjhg asdgahdgasdhghasdghagdshdhasgadahdghasdgasd
    
por Vaibhav 27.01.2017 / 17:55

1 resposta

0

Sua abordagem tem dois problemas:

  1. Você compara a linha de entrada inteira com o timestamp lexicograficamente. Se a linha começar com o carimbo de data / hora final e contiver caracteres adicionais, ela será classificada após o registro de data e hora, conforme as sequências mais longas forem classificadas após sequências mais curtas.
  2. Você não tem nenhuma regra que lide com linhas que não começam com um registro de data e hora. Como eles não são classificados entre os timestamps de início e fim, eles não serão incluídos na saída. Como essas linhas são identificadas?

Tente algo assim:

$1 == date {
    start = substr($2, 0, length(start_time));
    end = substr($2, 0, length(end_time));
    if (start_time <= start && end <= end_time) print;
    next;
}
{ print; }
    
por 30.01.2017 / 08:16