내 로그 파일은 다음 예와 같습니다.
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
$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 개체로 변환됩니다. 날짜/시간 요소는 색인이 0인 열과 각 열이 lines
공백으로 구분된 열로 분할 되는 경우에 있습니다 . 이는 itute 명령을 사용하여 변환되고 DateTime 객체를 생성합니다 . 그런 다음 각 줄을 테스트하여 DateTime 개체가 필수 범위 내에 속하는지 확인합니다.words
.[3]
.[4]
subst
join
ISO 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