날짜 범위 내 로그 검색

날짜 범위 내 로그 검색

내 로그 파일은 다음 샘플과 같습니다.

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

어떻게 해야 하나요?


내 쿼리에 대한 스크립트를 작성하는 방법에 대해 알고 싶습니다. May OS는 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"필터 중 하나입니다. 을 사용하여 네 번째 필드( )의 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 개체로 변환됩니다. 각각이 lines공백으로 구분된 으로 분할 되면 words날짜/시간 요소는 인덱스가 0인 열과 에서 발견 됩니다 .[3]. .[4]이는 substitute 명령을 사용하여 변환되고 DateTime 객체를 join생성하기 위해 ed됩니다 . ISO 8601그런 다음 각 행을 테스트하여 해당 DateTime 객체가 원하는 범위 내에 속하는지 확인합니다 $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

관련 정보