O GREP trabalharia para filtrar um arquivo de log com base em palavras-chave, datas, carimbos de hora? Ou existe uma alternativa melhor?

0

Estou tentando filtrar um arquivo de log com base no seguinte:

intervalo de datas de um erro (aaaa-mm-dd)

intervalo de registro de data e hora de um erro (01:00:00 - 00:00:00)

palavras-chave (previousFireTime, nextFireTime)

Estou tentando grep do arquivo de log, mas não consigo obter os dados de que preciso usando grep . Eu teria que usar uma combinação de awk e grep ou awk e sed para obter as informações de que preciso? Ou haveria uma rota melhor e mais eficiente para filtrar um arquivo de log?

Editar: Exemplo de saída de log

2018-06-06 10:46:43,708 INFO [stdout] (AsyncAppender-Worker-STDOUT) INFO 
[erFactoryBean_Worker-9] [c.c.c.s.i.d.ResendJob] Executing Quartz scheduled 
job: JobExecutionContext: trigger: 'ResendJob.trigger_ResendJob job: 
DEFAULT.ResendJob fireTime: 'Wed Jun 06 10:46:43 UTC 2018 scheduledFireTime: 
Wed Jun 06 10:46:43 UTC 2018 previousFireTime: 'Wed Jun 06 10:45:43 UTC 2018 
nextFireTime: Wed Jun 06 10:47:43 UTC 2018 isRecovering: false refireCount: 0
    
por Lemn 06.06.2018 / 17:16

2 respostas

2

awk é provavelmente tudo o que você precisa aqui, pois pode fazer correspondência de expressões regulares, dividir linhas em campos e fazer comparações de strings (o que funciona para comparação de datas, desde que você use carimbos de data e hora YYYY-MM-DD HH: MM: SS e não há mudança de horário de verão).

Se a data estiver no primeiro campo e a hora no segundo:

awk -v date=1 -v time=2 '
  $date > "2018-05-24" && $time < "12:00:00" && /some text/'

A implementação GNU awk de awk possui extensões de formatação e análise de data que permitem fazer coisas mais avançadas, como:

gawk -v date=1 -v time=2 '
  function parse_time(t) {
    gsub(/[:-]/, " ", t)
    return mktime(t)
  }
  BEGIN {
    start = parse_time("2018-01-01 08:00")
    end = systime() - 86400 # yesterday, same time
  }
  {t = parse_time($date" "$time)}
  t >= start && t <= end && /some test/'
    
por 06.06.2018 / 17:38
1

o grep filtra expressões regulares. É muito bom filtrar as linhas que contêm uma determinada palavra-chave, mas é difícil especificar um período usando expressões regulares. Por exemplo, para receber erros entre 1º de janeiro, 20:00 e 3 de janeiro, 2:00, você deve aceitar todos os horários de 2 de janeiro, mas apenas a noite de 1º de janeiro e apenas a manhã de 3 de janeiro. Você não pode separar a hora do dia e a data, por exemplo.

É muito mais simples usar uma ferramenta mais expressiva que possa comparar nativamente datas. O Perl é uma linguagem popular para fazer esse tipo de coisa, e o Python é uma boa alternativa.

Veja um exemplo em Python:

import re
import time

f = open('/var/log/syslog')
line = f.readline()
while line:
    # Get the date at the beginning of line with a regex
    m = re.match(r'^([^\s]+\s+[^\s]+\s+[^\s]+)\s+', line)
    # Parse the date
    date = time.strptime(m.group(1), '%b %d %H:%M:%S')
    # Compare with a given date
    if date > time.strptime('Jun 6 14:00:00', '%b %d %H:%M:%S'):
        print(line, end='')

    # Read next line
    line = f.readline()
    
por 06.06.2018 / 17:38