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

おすすめ記事