Grep para o intervalo de números [duplicado]

12

Como você procuraria um arquivo de log por um período?

O arquivo de log é assim:

01/14 00:00:01  INFO:     received connect request from 10.10.10.10 

Eu preciso condensar o registro para 10 minutos, começando às 8:25 e indo até 8:35

Quando uso o seguinte egrep, eu encontro muitos resultados, como 00:08:25 01:08:25 ... 08:25:00 ..

Como posso obter apenas 08:25:00 até 08:35:59

O que eu tentei

cat foo | egrep "08:2[5-9]|08:3[0-5]"
cat foo | egrep "08:2[5-9]:??|08:3[0-5]:??"
cat foo | egrep "08:2[5-9]:[0-9][0-9]|08:3[0-5]:[0-9][0-9]"
    
por spuder 21.03.2014 / 19:13

4 respostas

8

Isso deve produzir o resultado desejado.

egrep "08:[2][5-9]:[0-5][0-9]|08:[3][0-5]:[0-5][0-9]" foo

Usar cat neste caso não é necessário.

    
por 21.03.2014 / 19:32
4

Com estas entradas:

01/15 00:00:01  INFO:     received connect request from 10.10.10.10
01/14 00:00:01  INFO:     received connect request from 10.10.10.10
01/14 08:25:01  INFO:     received connect request from 10.10.10.10
01/14 00:00:01  INFO:     received connect request from 10.10.10.10
01/14 00:00:01  INFO:     received connect request from 10.10.10.10
01/14 08:35:01  INFO:     received connect request from 10.10.10.10
01/14 00:00:01  INFO:     received connect request from 10.10.10.10

Você pode imprimir todas as linhas entre dois padrões, usando awk :

awk -v date='01/14' '$1!=date{next};/08:25/,/08:35/' logfile

01/14 08:25:01  INFO:     received connect request from 10.10.10.10
01/14 00:00:01  INFO:     received connect request from 10.10.10.10
01/14 00:00:01  INFO:     received connect request from 10.10.10.10
01/14 08:35:01  INFO:     received connect request from 10.10.10.10
    
por 21.03.2014 / 19:44
2

Se você está aberto para usar sed , você pode fazer:

sed -n '/^01\/14 08:00/,/^01\/14 08:10/p' foo

Em geral, você pode usar variáveis bash para substituir as horas específicas no comando acima. Por exemplo:

st="01\/14 08:00"
en="01\/14 08:25"
sed -n "/^$st/,/^$en/p" foo #note the double quotes

Você precisa escapar do caractere / com \ se estiver usando / como separador, conforme mostrado no comando acima.

    
por 21.03.2014 / 19:36
1

Você poderia usar perl. O seguinte executa uma comparação lexical no campo de tempo, o que implica que ele funcionaria mesmo se você não tiver uma linha contendo a hora inicial ou final.

 yourprogram | perl -lane 'print if $F[1] ge "08:25:00" and $F[1] lt "08:36:00"'

Isso pressupõe que o horário é o segundo campo na sua entrada e está no formato hh:mm:ss .

Você também pode especificar a data adicionando outra condição:

 yourprogram | perl -lane 'print if $F[1] ge "08:25:00" and $F[1] lt "08:36:00" and $F[0] eq "01/14"'

A entrada é gerada usando o seguinte script:

for ((h=8;h<9;h++)); do
  for ((m=20;m<40;m=m+2)); do
    for ((s=0;s<60;s=s+10)); do
      printf "01/14 %02d:%02d:%02d line %d\n" $h $m $s $((++l))
    done
  done
done

Executando

bash script | perl -lane 'print if $F[1] ge "08:25:00" and $F[1] lt "08:36:00"'

produz:

01/14 08:26:00 line 19
01/14 08:26:10 line 20
01/14 08:26:20 line 21
01/14 08:26:30 line 22
01/14 08:26:40 line 23
01/14 08:26:50 line 24
01/14 08:28:00 line 25
01/14 08:28:10 line 26
01/14 08:28:20 line 27
01/14 08:28:30 line 28
01/14 08:28:40 line 29
01/14 08:28:50 line 30
01/14 08:30:00 line 31
01/14 08:30:10 line 32
01/14 08:30:20 line 33
01/14 08:30:30 line 34
01/14 08:30:40 line 35
01/14 08:30:50 line 36
01/14 08:32:00 line 37
01/14 08:32:10 line 38
01/14 08:32:20 line 39
01/14 08:32:30 line 40
01/14 08:32:40 line 41
01/14 08:32:50 line 42
01/14 08:34:00 line 43
01/14 08:34:10 line 44
01/14 08:34:20 line 45
01/14 08:34:30 line 46
01/14 08:34:40 line 47
01/14 08:34:50 line 48
    
por 21.03.2014 / 19:54