Estou fazendo uma busca de intervalo com sed. Eu quero analisar os dados de log da data e hora 2016-09-29 01:00
até o 2016-09-29 01:30
. É por isso que estou usando 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 até o final.
Então, como trabalhar com isso para que, se 1:30
não existir, vá para o próximo registro não até o final.
Coisas a serem consideradas: Os logs contêm rastreamento de pilha para que as linhas que contenham rastreamento de pilha não comecem com a data.
Não tão estranho.
sed
é um editor de streams , ele processa as linhas à medida que elas chegam. Um intervalo como/a/,/b/
significa que as linhas são selecionadas assim quea
são encontradas e não mais selecionadas apósb
serem encontradas. Seb
nunca for encontrado, nunca parará de selecionar linhas.Aqui, você deve usar
awk
em vez disso. Supondo que esses carimbos de data e hora estejam no início da linha:Observe que ele selecionará apenas linhas que tenham um carimbo de data/hora no intervalo, portanto, excluirá linhas que não tenham um carimbo de data/hora, mesmo que estejam entre as linhas que tenham carimbos de data/hora no intervalo.
Outra abordagem para contornar isso seria:
Ou seja, use um intervalo como em
sed
, mas insira o intervalo na primeira linha que está entre as 2 datas e deixe-o apenas quando encontrar uma linha com um carimbo de data/hora maior que a data final.