패턴이 발생할 때(아래 예에서는 "이벤트 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
문자열을 찾을 수 없으면 출력이 없습니다.