내 원본 로그 파일은 프로덕션 로그와 유사하므로 이를 조정했습니다.
f1 차단 PCO 블록 f1 트레이: 학교 SAM: XP X/Y 이중 축 키Z/Z 블록 f2 PCO 블록 f2 트레이: 학교 SAM: XP D/D 반복 키 D/D 블록 f3 PCO 블록 f3 트레이: 학교 SAM: AP X/Y 이중 축 키Z/Z -----계속..800개 이상의 기록
필터 적용 시 예상되는 결과는 다음과 같습니다. 조건 1: SAM이 발견된 경우:
f1 차단 PCO 블록 f1 트레이: 학교 SAM: XP X/Y 이중 축 키Z/Z
조건 2: SAM인 경우:
블록 f2 PCO 블록 f2 트레이: 학교 SAM: XP D/D 반복 키 D/D
이와 같이 800개의 레코드를 반복하고 출력을junk.txt에 인쇄합니다. 참고: 줄은 줄어들거나 늘어날 수 있습니다. 여기서 블록은 중간에 PCO BlockXX로 시작하고 끝나는 것으로 간주되므로 스크립트는 이 블록을 무시한다고 간주해서는 안 됩니다.
감사합니다. 지금까지 awk 'BEGIN{RS="Block\n"; ORS=RS} $0=="" || /KEY:ZZ/ && /XY/ {print}' raw.txt >> waste 를 시도했습니다. txt.
HP-UX를 사용하고 있습니다
답변1
sed에 대한 거의 표준 작업
sed '
/^Block/! D
:1
N
$!{
/\n\s*KEY/! b1
}
\%SAM.*D/D.*D/D\|SAM.*X/Y.*Z/Z%! d
' log
생산
Block f1
PCO Blockf1
tray:school SAM :XP
X/Y DUPL
KEY Z/Z
Block f2
PCO Blockf2
tray:school SAM :XP
D/D DUPL
KEY D/D
Block f3
PCO Blockf3
tray:school SAM :AP
X/Y DUPL
KEY Z/Z
답변2
sed -e '
/^Block/,/[ ]KEY[ ]/!d; # reject noninteresting data
H; /^Block/h; /[ ]KEY[ ]/!d; # stuff block in hold space
g; # retrieve block when block ends
/SAM[ ]*:XP\n/!d; # filter out block since no SAM XP
/\n[ ]*KEY[ ]*\([DZ]\)\/\1$/!d; # filter out block since no key D/D|Z/Z
n;p;s/^/\n/;D; # print block, print next line, go back
' yourfile
산출
Block f1
PCO Blockf1
tray:school SAM :XP
X/Y DUPL
KEY Z/Z
Block f2
Block f2
PCO Blockf2
tray:school SAM :XP
D/D DUPL
KEY D/D
Block f3