Start ---End에 여러 문자열이 있는 경우 전체 블록을 인쇄합니다.

Start ---End에 여러 문자열이 있는 경우 전체 블록을 인쇄합니다.

내 원본 로그 파일은 프로덕션 로그와 유사하므로 이를 조정했습니다.

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

관련 정보