날짜 범위별로 로그 검색

날짜 범위별로 로그 검색

내 로그 파일은 다음 예와 같습니다.

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

다음과 같이 날짜 범위를 지정하여 위 항목을 검색하고 싶습니다.

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

예상되는 결과:

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

어떻게 해야 하나요?


내 쿼리를 스크립팅하는 방법에 대한 아이디어가 있습니다. 가능한 운영 체제는 Solaris 11입니다. 몇 가지 샘플 스크립트를 제공해 주세요.

답변1

grep이는 표준 HTTP 액세스 로그처럼 보입니다. 원하는 날짜 패턴과 일치하도록 사용하는 것은 어떨까요 ?

$ 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

grep 패턴 '1[0-3]/Aug/2020'은 범위 표현식 [0-3]을 사용합니다. 이 표현식은 0, 1, 2, 3 값을 가질 수 있는 단일 문자와 일치합니다. 이것을 나머지 표현식과 결합하면 2020년 8월 10일, 2020년 8월 11일, 2020년 8월 12일 및 2020년 8월 13일을 가능한 패턴으로 얻습니다. grep이러한 패턴과 일치하는 행이 로그에서 인쇄됩니다.

답변2

Miller(https://github.com/johnkerl/miller) 그리고 실행

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

가지다

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

필터를 적용하여 2020-08-11와 사이의 모든 내용을 가져왔습니다.2020-08-13

몇 가지 참고사항:

  • --nidx입력 및 출력 형식 설정(https://bit.ly/3h3UvN3)
  • filter필터를 적용합니다.
  • strftime(strptime($4,"%d/%b/%Y:%H:%M:%S"),"%Y-%m-%d") >="2020-08-11"필터 중 하나입니다. I를 사용하여 네 번째 필드( )의 strptime입력 날짜 형식( )을 설정합니다. 나를 사용하여 날짜 형식 변경%d/%b/%Y:%H:%M:%S$4strftime%Y-%m-%d

답변3

사용행복하다(이전 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

#또는:

~$ 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 

위 내용은 Perl 계열의 프로그래밍 언어인 Raku로 작성된 답변입니다. Raku에는 ISO 8601DateTime 개체가 내장되어 있습니다.

즉, 각 행의 날짜/시간이 ISO 8601DateTime 개체로 변환됩니다. 날짜/시간 요소는 색인이 0인 열과 각 열이 lines공백으로 구분된 열로 분할 되는 경우에 있습니다 . 이는 itute 명령을 사용하여 변환되고 DateTime 객체를 생성합니다 . 그런 다음 각 줄을 테스트하여 DateTime 개체가 필수 범위 내에 속하는지 확인합니다.words.[3].[4]substjoinISO 8601$start .. $stop

입력 예:

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

샘플 출력(두 가지 코드 예):

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

관련 정보