
내 로그 파일은 다음 샘플과 같습니다.
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
$4
strftime
%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 8601
DateTime 객체가 내장되어 있습니다.
간단히 말해서 각 줄의 날짜/시간은 ISO 8601
DateTime 개체로 변환됩니다. 각각이 lines
공백으로 구분된 으로 분할 되면 words
날짜/시간 요소는 인덱스가 0인 열과 에서 발견 됩니다 .[3]
. .[4]
이는 subst
itute 명령을 사용하여 변환되고 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