如果在 Start ---End 中找到多个字符串,则打印整个 Block

如果在 Start ---End 中找到多个字符串,则打印整个 Block

我的原始日志文件类似于生产日志,我对此进行了调整,

块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

相关内容