私の元のログファイルは本番ログに似ているので、これを調整しました。
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