다음 순서로 나타날 다른 행에 다음 데이터가 있습니다.
trackingID=QsSDsad2yP80Q82G5Y8V2QRWhGQCYy97bX; ***************Some other Data ********************** Trn-status: INCOMPLETE", ***************Some other Data **********************
trackingID=QsSDsad2yP80Q82G5Y8V2QRWhGQCYy97bX; ***************Some other Data **********************
trackingID=QsSDsad2yP80Q82G5Y8V2QRWhGQCYy97bX; ***************Some other Data **********************:{\"details\":[{\"errorCode\":\"MyErrorCode\",\"message\":\"TECHNICAL EXCEPTION\",\"timeStamp\":\"2019-10-03T09:08:56.886Z\"}],***************Some other Data **********************
trackingID=E32878dfgdf45ddf567u5V2QRsdfdsj657V; ***************Some other Data **********************:{\"details\":[{\"errorCode\":\"Test0001\",\"message\":\"Valiadtion EXCEPTION\",\"timeStamp\":\"2019-10-03T09:08:56.886Z\"}],***************Some other Data **********************
이 행은 후속 행이 아니며, 이 행 사이에 다른 데이터가 있을 수 있습니다.
message
errorCode 속성의 값 을 추출하고 싶습니다.TECHNICAL EXCEPTION
그리고 Trn-status
INCOMPLETE
Unix/linux 명령을 사용합니다 . (여러 쌍이 있더라도 일치하는 모든 행 쌍에 대한 데이터를 추출하고 싶습니다.)
두 줄 모두 동일한 추적 ID를 갖습니다.
저는 Unix/Linux를 처음 사용합니다. 명령에서 오류 코드를 얻는 데 도움을 주실 수 있나요?
답변1
다음을 사용할 수 있습니다 awk
.
항상 가정이 Trn-status
우선이다TECHNICAL EXCEPTION
awk -F'[\;\=]' '
{ if ( $0 ~ /Trn-status: INCOMPLETE/ ) checkid[$2]=$2 ;
if ( $2 == checkid[$2] ) {
if ( $0 ~ /TECHNICAL EXCEPTION/ ) print checkid[$2]
}
}' logfile
설명하다:
-F'[\;\=]'
;
또는 필드 구분 기호로 사용=
: 대괄호를 사용하면 여러 필드 구분 기호를 정의할 수 있습니다. 세미콜론과 등호는 특수 문자이므로awk
백슬래시로 이스케이프해야 합니다.- 첫 번째 줄:
$0
전체 줄을 나타내며~
(하위)패턴 일치 연산자 및/PATTERN/
검색 문자열입니다. 따라서Trn-status: INCOMPLETE
행에서 찾으면 인덱스가 ID 자체의 이름인 배열에 ID(다른 필드로 구분된 두 번째 필드)를 저장합니다 ( 문자열 을;
인덱스 카운터로 사용할 수 있음).=
checkid
awk
- 두 번째 행: 다른 행에서 ID를 찾으면...
- 3행: ID가 나타나는지 확인
TECHNICAL EXCEPTION
하고 나타나면 인쇄하세요. - (
logfile
파일 이름입니다)
답변2
이 작업은 나에게 너무 복잡 하지만 다음과 같이 grep
사용할 수 있습니다 .sed
sed '/Trn-status:/h;/\\"message\\":\\"TECHNICAL EXCEPTION\\"/!d;G;/Trn-status: INCOMPLETE/!d;s/.*"errorCode\\":\\"//;s/\\".*//' yourfile
/Trn-status:/h
항상Trn-status
예약된 공간에 마지막 행을 저장하세요./\\"message\\":\\"TECHNICAL EXCEPTION\\"/!d
주어진 패턴이 없는( )d
모든 행을 삭제함을 나타냅니다.!
백슬래시는 다른 백슬래시로 이스케이프 처리해야 합니다.- 스크립트의 나머지 부분은
TECHNICAL EXCEPTION
메시지만 처리하지만 이제 그것이 인지 확인해야 하므로Trn-status
예약INCOMPLETE
된 공간을 에 추가하고G
찾지delete
못한 경우Trn-status: INCOMPLETE
- 이제 찾고 있는 코드 앞( )과 뒤( )
s/.*"errorCode\\":\\"//
부분을 삭제하세요.s/\\".*//
답변3
@Fiximan의 작업을 뻔뻔하게 기반으로 구축했습니다 awk
.
데이터의 내용이 불확실하다고 가정하므로 필드를 반복하여 실제 오류 코드를 찾으십시오.
awk -F'[:;,=]' '{
if ( $0 ~ /Trn-status: INCOMPLETE/ ) checkid[$2]=$2 ;
if ( $2 == checkid[$2] && $0 ~ /TECHNICAL EXCEPTION/ ) {
for (i=1; i<=NF; i++) {if ( $i ~ "\"errorCode") print $(i+1), $2
}
}
}' logfile | sed "s/[\\\"]//g"