따라서 다음과 같은 로그 샘플이 있습니다.
2015-03-30 10:19:44,200 DEBUG [Default : 1] [Application:ABC BIW: IDA:6d87de8e-1276-4496-b49d-dd4cd375cbe4 Info:P23 Code:ABCD] A log message 1
2015-03-30 10:19:45,250 DEBUG [Default : 1] [Application:ABC BIW: IDA:6d87de8e-1276-4496-b49d-dd4cd375cbe4 Info:P23 Code:ABCD] A log message 2
2015-03-30 10:19:45,700 DEBUG [Default : 1] [Application:ABC BIW: IDA:6d87de8e-1276-4496-b49d-dd4cd375cbe4 Info:P23 Code:ABCD] log message of exception occurred in
abc.cdef.class.sdk.SampleException: Message exception..
<stacktrace lines goes here>
2015-03-30 10:19:46,100 DEBUG [Default : 1] [Application:ABC BIW: IDA:6d87de8e-1276-4496-b49d-dd4cd375cbe4 Info:P23 Code:ABCD] A log message 3
2015-03-30 10:19:46,120 DEBUG [Default : 1] [Application:ABC BIW: IDA:6d87de8e-1276-4496-b49d-dd4cd375cbe4 Info:P23 Code:ABCD] A log message 4
2015-03-30 10:19:46,120 DEBUG [Default : 1] [Application:ABC BIW: IDA:6d800e80-5276-4006-a44d-dd4cea7bcbe1 Info:P13 Code:AB4D] A log message 6
서버로 들어오는 각 요청에는 고유한 IDA가 있습니다. 특정 IDA가 포함된 모든 로그 줄을 파악하고 발견된 모든 항목을 다른 로그 파일에 저장하고 싶습니다. grep을 사용하는 이유는 패턴이 발견된 파일과 줄 번호도 추가하기 때문입니다( grep -n )(검색은 2~3개의 파일에서 수행됩니다). 그러나 스택 추적 예외도 포함되기를 원했지만 해당 라인에 내가 검색한 IDA가 없었기 때문에 이런 일이 발생하지 않았습니다.
또한 아래와 같이 스택 추적 예외가 특정 IDA에 대한 마지막 항목의 일부로 발생할 수도 있습니다.
2015-03-30 10:19:44,200 DEBUG [Default : 1] [Application:ABC BIW: IDA:6d87de8e-1276-4496-b49d-dd4cd375cbe4 Info:P23 Code:ABCD] A log message 1
2015-03-30 10:19:45,200 DEBUG [Default : 1] [Application:ABC BIW: IDA:6d87de8e-1276-4496-b49d-dd4cd375cbe4 Info:P23 Code:BECD] A log message 2
2015-03-30 10:19:44,200 DEBUG [Default : 1] [Application:ABC BIW: IDA:6d87de8e-1276-4496-b49d-dd4cd375cbe4 Info:P23 Code:DFCD] A log message 3
2015-03-30 10:19:45,200 DEBUG [Default : 1] [Application:ABC BIW: IDA:6d87de8e-1276-4496-b49d-dd4cd375cbe4 Info:P23 Code:BBCD] A log message 4
2015-03-30 10:19:45,200 DEBUG [Default : 1] [Application:ABC BIW: IDA:6d87de8e-1276-4496-b49d-dd4cd375cbe4 Info:P23 Code:ABCC] log message of exception occurred in
abc.cdef.class.sdk.SampleException: Message exception..
<stacktrace lines goes here>
2015-03-30 10:19:45,200 DEBUG [Default : 1] [Application:ABC BIW: IDA:ed8ede83-1116-4697-a69d-ee6cd575cbe7 Info:P23 Code:ABDD] A log message 5
이 작업을 수행하기 위한 제안 사항이 있습니까?
PS1 - 여기저기 검색해 봤지만 대부분 태그 사이에서 검색하는 것으로 나타났는데, 이는 나에게 충분하지 않습니다.
PS2 - 내 솔루션 OS는 현재 한 줄의 grep이지만 Perl, awk, sed, Python 또는 기타 "bash 명령 방식"과 같은 다른 솔루션에도 열려 있습니다.
답변1
펄 솔루션:
perl -ne '$id = "6d87de8e-1276-4496-b49d-dd4cd375cbe4";
print if $match = (/IDA:$id/ .. /IDA:(?!$id)/)
and $match !~ /E0$/
' *.log
설명하다:
/regex1/ .. /regex2/
일치하는 행 사이의 행에 대해 true를 반환합니다.IDA:(?!$id)
나와IDA:
관심 없음$id를 통해- 범위의 마지막 행은
E0
조건 확인의 접미사로 표시되므로 마지막 행(IDA가 다른 행)은 인쇄되지 않습니다.
파일 이름과 줄 번호를 포함하려면 다음을 사용하십시오.
print "$ARGV:$.:$_"
견적을 마무리하기 전에 다음을 추가하세요.
; $. = 0 if eof
답변2
그러면 해당 데이터(각각 행 번호가 앞에 옴)가 IDA라는 파일에 인쇄됩니다.
awk 'match($0,/IDA:[^ ]+/) { print NR, $0 > substr($0,RSTART+4,RLENGTH-4) }' logfile
답변3
Sed
해결책:
sed -n ':2;/IDA:6d87de8/{p;/exception/{:1;n;/IDA:/!{p;b1};b2}}'
이 스크립트는 -n
적절한 IDA( /IDA:6d87de8/
)가 충족될 때까지 출력( 옵션)을 억제하고 인쇄( )됩니다 p
. 패턴(라인)은 "예외"가 있는지 확인하고, 그렇다면 다음 라인( n
) 실행을 시작합니다. 다음 줄에 포함되어 있지 않으면 IDA:
해당 줄이 인쇄되고 스크립트는 다음 줄로 이동합니다( :1
지점에서 반복). 라인 cosist IDA:
스크립트가 처음부터 시작하는 경우( :2
지점에서 루프)
행을 열거하려면 nl
또는를 통해 행을 출력 하고 스크립트 grep -n ".*"
로 파이프하십시오 .sed