범위에 특정 문자열이 포함된 경우 날짜 범위 사이의 로그 범위 가져오기

범위에 특정 문자열이 포함된 경우 날짜 범위 사이의 로그 범위 가져오기

검색 문자열이 존재할 때 특정 날짜 범위 내의 파일에서 여러 줄 범위를 검색하고 있습니다. 저는 유닉스 전문가가 아니며 이것을 구현하는 방법을 모릅니다. 인터넷 검색 후 awk 및 sed 명령(아래 설명)을 사용하여 날짜 범위 내의 로그를 표시할 수 있지만 검색 기준을 추가할 수는 없습니다. 로그 파일 형식은 다음과 같습니다.

로그 파일 내용

[2020/07/05 21:10:28.961][INFO ][ABCDDDDDDD]
------------------------------------------------------------
ID: ABCDDGSDFEWRER
MESSAGE: Event Message received.
------------------------------------------------------------
CONTEXT: {
  "ID" : 1,
  "BC" : 9789,
  "event" : "something",
  COMMON_TEXT: COMMON
    "valid" : true
}
************************************************************
[2020/07/05 21:10:28.816][INFO ][ABCDDDDDEEEEEEE]
------------------------------------------------------------
ID: ABCDDSDFSDFSDFSDFSDFSDFSDFFEWRER
MESSAGE: Event Message received.
------------------------------------------------------------
CONTEXT: {
  "ID" : 1,
  "BC" : 9089,
  "event" : "One More thing",
  COMMON_TEXT: COMMON
    "valid" : true
}
************************************************************
[2020/07/05 21:10:43.816][INFO ][ABCDDDDDEEFFFFFFFFFFFFFEEE]
------------------------------------------------------------
ID: QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
MESSAGE: Event Message received.
------------------------------------------------------------
CONTEXT: {
  "ID" : 1,
  "BC" : 9789,
  "event" : "Second thing",
  COMMON_TEXT: COMMON
    "valid" : False
}
************************************************************

현재 사용하는 명령은 다음과 같습니다.

  • awk:(sed 명령은 정확한 시작 시간을 인식하지 못하므로 정확한 시작 시간을 얻으십시오)
    awk 'substr($1,2,11)>="2020\/07\/05" && substr($1,2,11)<="2020\/07\/05" && substr($2,1,8)>="21:10:28" && substr($2,1,8)<="21:10:43" {print $0}' logfileName
    
  • sed: 주어진 시간 범위에 대한 로그를 가져옵니다(두 날짜 사이의 차단). 중간 블록을 인쇄할 필요가 없습니다(내 시간 범위 내에 있지만 9789가 포함되어 있지 않기 때문에).
    sed -n '/2020\/07\/05 21:10:28.010/,/2020\/07\/05 21:10:30.668/{;p};/2020\/07\/05 21:10:30.668/,/\*\*\*/{;p}' logfileName
    

다음은 내가 찾고 있는 결과의 샘플입니다. 1. 아래 두 블록은 내가 원하는 시간 제한 내에 있습니다. 2. 여기에는 "BC"가 포함되어 있습니다: 9789(원하는 숫자) 현재 위의 두 명령을 사용하고 있습니다. Java 코드를 사용하여 중간 블록을 제거하여 결합 및 유효성 검사(9789)를 처리합니다.

[2020/07/05 21:10:28.961][INFO ][ABCDDDDDDD]
------------------------------------------------------------
ID: ABCDDGSDFEWRER
MESSAGE: Event Message received.
------------------------------------------------------------
CONTEXT: {
  "ID" : 1,
  "BC" : 9789,
  "event" : "something",
  COMMON_TEXT: COMMON
    "valid" : true
}
************************************************************
[2020/07/05 21:10:43.816][INFO ][ABCDDDDDEEFFFFFFFFFFFFFEEE]
------------------------------------------------------------
ID: QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
MESSAGE: Event Message received.
------------------------------------------------------------
CONTEXT: {
  "ID" : 1,
  "BC" : 9789,
  "event" : "Second thing",
  COMMON_TEXT: COMMON
    "valid" : False
}
************************************************************

답변1

다음과 같은 이유로 약간 장황합니다.

..일회성이 아니라고 가정하고 변수를 적절하게 노출하여 스크립트에 대한 인수로 만듭니다.

..읽기 쉽고 적응 가능합니다.

..타임스탬프부터 모든 별표가 포함된 다음 줄까지 전체 로그 항목 블록을 표시합니다.

#! /bin/bash

Low='2020/07/05 21:10:28'
End='2020/07/05 21:10:43'

AWK='
BEGIN { 
    reTS = "[[]20../../.. ..:..:..[.]...[]]";
    reStop = "^[*]+$";
}
function Range (ts) {
    return ((ts < Low || ts > End) ? "N" : "Y");
}
match ($0, reTS) { Block = Range( substr ($0, RSTART+1, RLENGTH-6)); }
Block == "Y" { print; }
$0 ~ reStop { Block = "N"; }
'
    awk -v Low="${Low}" -v End="${End}" "${AWK}" myLog.txt

답변2

sed 명령이 약간 변경되었습니다.

sed -n '/2020\/07\/05 21:10:28\.010/,/2020\/07\/05 21:10:30\.668/{;p};/2020\/07\/05 21:10:30\.668/,/\*\*\*/{;p}'

귀하의 명령을 이스케이프하면됩니다. 앞에 백슬래시를 배치하면 됩니다. 즉 2020/07/05 21:10:28\.010

관련 정보