Unix/Linux 명령은 다른 줄에 단어가 포함되어 있으면 단어를 캡처합니다(두 줄에는 공통 속성이 있음).

Unix/Linux 명령은 다른 줄에 단어가 포함되어 있으면 단어를 캡처합니다(두 줄에는 공통 속성이 있음).

다음 순서로 나타날 다른 행에 다음 데이터가 있습니다.

 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 **********************

이 행은 후속 행이 아니며, 이 행 사이에 다른 데이터가 있을 수 있습니다.

messageerrorCode 속성의 값 을 추출하고 싶습니다.TECHNICAL EXCEPTION 그리고 Trn-statusINCOMPLETEUnix/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(다른 필드로 구분된 두 번째 필드)를 저장합니다 ( 문자열 을 ;인덱스 카운터로 사용할 수 있음).=checkidawk
  • 두 번째 행: 다른 행에서 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"

관련 정보