grep/sed를 사용하여 첫 번째 패턴을 추출한 다음, 첫 번째 패턴 이전에 발생하고 첫 번째 패턴과 관련된 두 번째 패턴을 추출합니다.

grep/sed를 사용하여 첫 번째 패턴을 추출한 다음, 첫 번째 패턴 이전에 발생하고 첫 번째 패턴과 관련된 두 번째 패턴을 추출합니다.

패턴이 발생할 때(아래 예에서는 "이벤트 100") 파일에서 특정 라인을 추출 하려고 합니다 .htm. 동시에 첫 번째 패턴과 관련되어 있지만 다음에서 오는 다른 패턴도 검색해야 합니다. 위의 줄 중 하나입니다. 두 번째 패턴은 첫 번째 패턴이 발생하는 시간을 나타냅니다.

예:

<AZ>207994</AZ>
<AZ>09:10:41.9</AZ>
<AZ>02/04</AZ>
<AZ>[990875]</AZ>
<TR VALIGN=TOP>
<AZ>207995</AZ>
<AZ>09:10:56.4</AZ>
<AZ>02/04</AZ>
<AZ>[990876]</AZ>
<AZ>30718</AZ><AZ><!--void--></AZ><AZ><!--void--></AZ><AZ><!--void--></AZ>
<AZ>TN (speed)  Event 3 occurred</TD></TR>
<TR VALIGN=TOP>
<AZ>30719</TD><TD><!--void--></AZ><AZ><!--void--></AZ><AZ><!--void--></AZ>
<AZ>TN (speed)  Event 100 occurred</TD></TR>
<TR VALIGN=TOP>
<AZ>30720</AZ><AZ><!--void--></AZ><AZ><!--void--></AZ><AZ><!--void--></AZ>

나는 다음과 같은 결과를 원합니다 :

02/04 09:10:56.4 [990876] 이벤트 100 발생

답변1

나는 다음과 같은 성가신 한 줄짜리를 생각해 냈습니다. (가독성을 위해 한 줄로 줄바꿈했습니다.)

awk -F'[<>]'  '($0 ~ /[0-9][0-9]:[0-9][0-9]:[0-9][0-9]/) {time=$3}
               ($0 ~ /[0-9][0-9]\/[0-9][0-9]/) {date=$3}
               ($0 ~ /\[[0-9]+\]/) {tag=$3}
               ($0 ~ /Event 100 occurred/) { print date, time, tag, "Event 100 occurred"}' < testfile

이렇게 하면 시간, 날짜, 레이블([12345]) 등을 일관되게 수집하고 "이벤트 100 발생"과 같은 줄이 나타나면 변수의 현재 내용을 인쇄합니다. 이것이 원하는 출력입니까?

답변2

이렇게 하면 트릭을 수행할 수 있습니다.

(grep -oP "Event 100" file && \
sed -ne 's/<\/\?AZ>//g' -e '7,9p' file) | \
awk 'BEGIN {RS=""; FS="\n";} \
{printf "%s %s %s %s\n", $3, $2, $4, $1}'

설명하다:

  • file:위 출력을 포함하는 파일
  • grep -oP "Event 100" file:"이벤트 100"을 검색하세요
  • sed -ne 's/<\/\?AZ>//g' -e '7,9p' file: 문자열이 발견되면 <AZ></AZ>레이블을 제거하고 7~9행을 인쇄합니다.
  • awk 'BEGIN {RS=""; FS="\n";}: awk의 필드 구분 기호를 개행 문자로 설정합니다.
  • {printf "%s %s %s %s\n", $3, $2, $4, $1}: 원하는 순서로 출력을 인쇄합니다.

산출(문자열이 발견된 경우):

02/04 09:10:56.4 [990876] Event 100

문자열을 찾을 수 없으면 출력이 없습니다.

관련 정보