Problema de faixa de sed se o último padrão não for atendido

0

Estou fazendo uma pesquisa de intervalo com sed. Quero analisar os dados de log da data e hora 2016-09-29 01:00 to 2016-09-29 01:30 . É por isso que tenho usado o seguinte comando,

$ sed -n '/2016-09-29 01:/,/2016-09-29 01:30:.*$/p'

Mas o problema é que se 1:30 não estiver disponível no log, ele retornará todos os logs para o final.

Então, como pode trabalhar com isso, de forma que, se 1:30 não existir, ele irá para o próximo registro, não até o final.

Coisas a serem consideradas: Os registros contêm rastreamento de pilha para que as linhas que contêm rastreamento de pilha não iniciem com a data.

    
por muhammad 29.08.2018 / 13:03

1 resposta

2

Não é tão estranho. sed é um iter s tream ed , ele processa as linhas conforme elas aparecem. Um intervalo como /a/,/b/ significa que as linhas são selecionadas assim que a for encontrado e não mais selecionadas após b ser encontrado. Se b nunca for encontrado, nunca parará de selecionar linhas.

Aqui, você deve usar awk . Supondo que esses timestamps estão no início da linha:

awk '$0 >= "2016-09-29 01:" && $0 < "2016-09-29 01:30"'

Observe que ele selecionará apenas as linhas que têm um registro de data e hora no intervalo, excluindo, portanto, as linhas que não têm um registro de data e hora, mesmo se estiverem entre as linhas com registros de data e hora no intervalo.

Outra abordagem para contornar isso seria:

awk -v start='2016-09-29 01:' -v end='2016-09-29 01:30' '
  $0 >= start && $0 <= end, /^[0-9]{4}([ :-][0-9]{2}){5}/ && $0 >= end'

Use um intervalo como em sed , mas insira o intervalo na primeira linha entre as duas datas e deixe-o apenas quando encontrarmos uma linha com um registro de data e hora maior do que a data final. / p>     

por 29.08.2018 / 13:19