我的原始日志文件类似于生产日志,我对此进行了调整,
块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 :XP,且 Z/Z 位于 X/Y 上方(仅供参考...Z/Z 上方行包含 X/Y),则像这样打印
块f1 PCO 块f1 托盘:学校 SAM:XP X/Y 双轴 关键 Z/Z
条件2:IF SAM :XP被发现D/D在D/D之上(仅供参考...D/D上面的行包含D/D)然后打印
块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 >> 垃圾.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