Filtre um arquivo de log por mês, data e hora no bash

3

Gostaria de buscar os dados entre Apr 24 10:00:00.000000 e Apr 25 24:00:00.999999 no log a seguir, mas não sei como fazer isso funcionar:

files/file1:Apr 22 02:47:00.663117 somedata    
files/file1:Apr 23 04:47:00.663127 somedata    
files/file1:Apr 24 05:47:00.663137 somedata    
files/file1:Apr 24 10:47:00.663137 somedata    
files/file1:Apr 25 01:47:00.663147 somedata    
files/file1:Apr 25 23:47:00.663157 somedata    
files/file1:Apr 25 23:47:00.663167 somedata    
files/file1:Apr 26 23:47:00.663177 somedata

Eu tentei usar o seguinte comando, mas isso filtraria apenas por hora e também não consideraria a data:

awk -v start=10:00:00.000000 -v stop=24:00:00.999999 'start <= $3 && $3 <= stop'

Gostaria que apenas os seguintes dados fossem obtidos:

files/file1:Apr 24 10:47:00.663137 somedata    
files/file1:Apr 25 01:47:00.663147 somedata    
files/file1:Apr 25 23:47:00.663157 somedata    
files/file1:Apr 25 23:47:00.663167 somedata

Alguém por favor pode ajudar com isso? Além disso, seria muito útil considerar o mês também durante a filtragem

    
por riya 01.05.2015 / 05:08

1 resposta

2

Você pode simplesmente adicionar mais variáveis para o filtro de dia:

awk -v start_day=24 -v stop_day=25 -v start_time=10:00:00.000000 -v stop_time=24:00:00.999999 'start_day <= $2 && $2 <= stop_day && start_time <= $3 && $3 <= stop_time' file

rendimentos

files/file1:Apr 24 10:47:00.663137 somedata    
files/file1:Apr 25 23:47:00.663157 somedata    
files/file1:Apr 25 23:47:00.663167 somedata

Falta-nos uma linha para 25 de abril porque filtramos cegamente o tempo para estar abaixo das 10h. Tudo o que precisamos fazer é implementar um teste lógico para filtrar o tempo apenas no primeiro dia:

awk -v start_day=24 -v stop_day=25 -v start_time=05:00:00.000000 -v stop_time=05:00:00.999999 'start_day <= $2 && $2 <= stop_day && (start_time <= $3 || start_day != $2) && $3 <= stop_time' file

rendimentos

files/file1:Apr 24 10:47:00.663137 somedata    
files/file1:Apr 25 01:47:00.663147 somedata    
files/file1:Apr 25 23:47:00.663157 somedata    
files/file1:Apr 25 23:47:00.663167 somedata 

Por meses você pode seguir a mesma ideia, mas você precisa traduzir de abril a 04 (pré-processamento ou awk magic?) e aplicar < = = > sobre isso.

    
por 01.05.2015 / 08:06