Pesquisa de registro dentro do intervalo de datas

Pesquisa de registro dentro do intervalo de datas

Meu arquivo de log se parece com o seguinte exemplo:

10.434.22.334 - unauthenticated 10/Aug/2020:23:45:45 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74
10.434.22.334 - unauthenticated 10/Aug/2020:23:45:45 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74
10.434.22.334 - unauthenticated 11/Aug/2020:23:34:45 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74
10.434.22.334 - unauthenticated 12/Aug/2020:23:45:43 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74
10.434.22.334 - unauthenticated 13/Aug/2020:23:43:45 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74
10.434.22.334 - unauthenticated 14/Aug/2020:23:33:45 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74

Quero pesquisar as entradas acima especificando um intervalo de datas, como abaixo:

./Logsearch.sh 10/Aug/2020 13/Aug/2020

Resultado esperado:

10.434.22.334 - unauthenticated 10/Aug/2020:23:45:45 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74
10.434.22.334 - unauthenticated 10/Aug/2020:23:45:45 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74
10.434.22.334 - unauthenticated 11/Aug/2020:23:34:45 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74
10.434.22.334 - unauthenticated 12/Aug/2020:23:45:43 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74
10.434.22.334 - unauthenticated 13/Aug/2020:23:43:45 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74

Como posso fazer isso?


Qualquer idéia de como escrever um script para minha consulta. O sistema operacional de maio é solaris 11. Forneça um exemplo de script.

Responder1

Parece um log de acesso HTTP padrão, então por que não usá-lo greppara corresponder a um padrão de datas desejado?

$ grep '1[0-3]/Aug/2020' access_log

10.434.22.334 - unauthenticated 10/Aug/2020:23:45:45 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74
10.434.22.334 - unauthenticated 10/Aug/2020:23:45:45 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74
10.434.22.334 - unauthenticated 11/Aug/2020:23:34:45 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74
10.434.22.334 - unauthenticated 12/Aug/2020:23:45:43 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74
10.434.22.334 - unauthenticated 13/Aug/2020:23:43:45 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74

O padrão grep '1[0-3]/Aug/2020' usa a expressão de intervalo [0-3]. Esta expressão corresponde a um único caractere que pode assumir os valores 0,1,2,3. Combine isso com o resto da expressão e você obterá 10/ago/2020, 11/ago/2020, 12/ago/2020 e 13/ago/2020 como os padrões possíveis. grepimprimirá as linhas do log que correspondem a esses padrões.

Responder2

Você poderia usar uma ferramenta especializada de texto estruturado como Miller (https://github.com/johnkerl/miller) e corra

mlr --nidx then filter 'strftime(strptime($4,"%d/%b/%Y:%H:%M:%S"),"%Y-%m-%d") >="2020-08-11" && strftime(strptime($4,"%d/%b/%Y:%H:%M:%S"),"%Y-%m-%d") <="2020-08-13"' input.txt

Ter

10.434.22.334 - unauthenticated 11/Aug/2020:23:34:45 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74
10.434.22.334 - unauthenticated 12/Aug/2020:23:45:43 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74
10.434.22.334 - unauthenticated 13/Aug/2020:23:43:45 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74

Eu apliquei um filtro para ter tudo entre 2020-08-11e2020-08-13

Algumas notas:

  • --nidxpara definir o formato de entrada e saída (https://bit.ly/3h3UvN3)
  • filteraplicar filtro;
  • strftime(strptime($4,"%d/%b/%Y:%H:%M:%S"),"%Y-%m-%d") >="2020-08-11"é um dos filtros. Usando strptimeeu defino o formato da data de entrada ( %d/%b/%Y:%H:%M:%S) do quarto campo ( $4). Usando strftimeeu mudo o formato da data em%Y-%m-%d

Responder3

UsandoRaku(anteriormente conhecido como Perl_6)

~$ raku -e 'my $start_date = DateTime.new("2020-08-11").in-timezone(28800);   \
            my $stop_date  = DateTime.new("2020-08-13").in-timezone(28800);   \
            my @a = lines.map: *.words; my @b = do for @a {  \
                  .[0..2],   \
                  .[3..4].join.subst(/^ (\d**2) \/ (Aug) \/ (\d**4) \: /, {"$2-08-$0T"} )   \
                  .subst(/ (\+\d**2) (\d**2) $/, {"$0:$1"} ).DateTime,  \
                  .[5..*] }; \
            .put if .[1] ~~ $start_date .. $stop_date for @b;'   file

#OU:

~$ raku -e 'my $start_date = DateTime.new("2020-08-11").in-timezone(28800);  \
            my $stop_date  = DateTime.new("2020-08-13").in-timezone(28800);  \
            my @a = lines.map(*.words).map({   \
                  .[0..2], (   \
                  .[3].subst(/^ (\d**2) \/ (Aug) \/ (\d**4) \: /, {"$2-08-$0T"} ),  \
                  .[4].subst(/ (\+\d**2) (\d**2) $ /, {"$0:$1"} )).join.DateTime,   \ 
                  .[5..*] });  \ 
            .put if .[1] ~~ $start_date .. $stop_date for @a;'   file 

Acima estão as respostas escritas em Raku, um membro da família Perl de linguagens de programação. Raku possui ISO 8601objetos DateTime integrados.

Resumidamente, a Data/Hora em cada linha é convertida em um ISO 8601objeto DateTime. Quando cada um deles linesé dividido em espaços em branco separados words, os elementos Data/Hora são encontrados em colunas indexadas em zero .[3]e .[4]. Eles são convertidos usando substcomandos itute e joineditados para criar ISO 8601objetos DateTime. Em seguida, cada linha é testada para verificar se o objeto DateTime está dentro de um $start .. $stopintervalo desejado.

Entrada de amostra:

10.434.22.334 - unauthenticated 10/Aug/2020:23:45:45 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74
10.434.22.334 - unauthenticated 10/Aug/2020:23:45:45 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74
10.434.22.334 - unauthenticated 11/Aug/2020:23:34:45 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74
10.434.22.334 - unauthenticated 12/Aug/2020:23:45:43 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74
10.434.22.334 - unauthenticated 13/Aug/2020:23:43:45 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74
10.434.22.334 - unauthenticated 14/Aug/2020:23:33:45 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74

Exemplo de saída (ambos exemplos de código):

10.434.22.334 - unauthenticated 2020-08-11T23:34:45+08:00 "GET /eai/random.jsp HTTP/1.1" 200 74
10.434.22.334 - unauthenticated 2020-08-12T23:45:43+08:00 "GET /eai/random.jsp HTTP/1.1" 200 74

https://www.iso.org/iso-8601-date-and-time-format.html
https://docs.raku.org
https://raku.org

informação relacionada