Tenho texto de arquivo grande (quase 3 GB) - é um arquivo de log. Desejo obter linhas de texto que correspondam a um intervalo de datas deste arquivo, de 13 a 19 de julho. Meu formato de log é:
2016-07-12 < ?xml version>
2016-07-13 < ?xml version>
2016-07-18 < ?xml version>
2016-07-18 < ?xml version>
2016-07-19 < ?xml version>
2016-07-20 < ?xml version>
sample text sample text
sample text sample text
sample text sample text
2016-07-20 < ?xml version>
sample text sample text
2016-07-20 < ?xml version>
então after grep
/ sed
it deve ser produzido assim:
2016-07-13 < ?xml version>
2016-07-18 < ?xml version>
2016-07-18 < ?xml version>
2016-07-19 < ?xml version>
Como posso conseguir isso?
command-line
grep
sed
Corey
fonte
fonte
Respostas:
Com
grep
se você souber o número de linhas que deseja, poderá usar a opção de contexto-A
para imprimir linhas após o padrãoque lhe dará a linha com 13/07/2013 e as próximas 3 linhas
com
sed
você pode usar as datas para delimitar assimque imprimirá todas as linhas da primeira linha com 13/07/2016 até e inclusive a primeira linha com 19/07/2016. Mas isso pressupõe que você tenha apenas uma linha com 19/07/2016 (não será impressa a próxima linha). Se houver várias linhas, use a próxima data e
d
exclua a saída delafonte
Este grep one liner simples será suficiente:
Funciona bem aqui e não há necessidade de sed :)
Referências:
fonte
^
para fazê-lo funcionar. Usando o Mac.awk
solução:Imprime basicamente qualquer linha, desde a que começa
2016-07-13
até a que começa com2016-07-19
fonte
Todas as outras respostas atuais se baseiam no fato de que as entradas do arquivo de log são classificadas cronologicamente ou no fato de que o período pode ser facilmente correspondido com expressões regulares. Se você deseja uma solução mais genérica, precisamos fazer mais programação.
Apresento este script GNU AWK:
Você fornece o horário de início e término através das variáveis
starttime
eendtime
em um formato quemktime
entende (YYYY MM DD hh dd ss
). Portanto, você executa oawk
comando da seguinte maneira, assumindo que o script Awk acima esteja em um arquivo executávelfilter-log-dates.awk
no diretório de trabalho atual e o arquivo de log sejamylog.txt
:Observe que o horário final é exclusivo , ou seja, os registros de log válidos devem ter um carimbo de data e hora antes do horário final.
Se o formato do carimbo de data / hora for diferente, você poderá ajustar a expressão regular passada para a
match
função para adequá-la.fonte
Você poderia fazer isso em etapas. Encontre o número da primeira linha que corresponde ao seu padrão inicial. Encontre o número da última linha correspondente ao seu padrão final. Em seguida, extraia o teste entre essas duas linhas. Isso pode ser feito da seguinte forma.
Isso pode ser feito em um
awk
comando, mas as etapas podem facilitar a execução. No awk, a variável NR é o número da linha atual e, como nenhuma ação foi especificada após o padrão (NR> = 1234 && NR <= 5678), a ação padrão é imprimir as linhas nesse intervalo.fonte