Text-Processing

如果在 Start —End 中找到多個字元串,則列印整個 Block

  • February 28, 2017

我的原始日誌文件類似於生產日誌,我對此進行了調整,

塊 f1
PCO Blockf1
托盤:學校 SAM:XP
X/Y 複製
鍵 Z/Z
塊 f2
PCO Blockf2
托盤:學校 SAM:XP
D / D 重複
關鍵 D/D
f3 塊
PCO Blockf3
托盤:學校 SAM:AP
X/Y 複製
鍵 Z/Z

-----續.. 800多條記錄

應用過濾器的預期結果如下:條件1:如果在 X/Y 上方的 Z/Z 上找到 SAM :XP(僅供參考…Z/Z 上面的行包含 X/Y),然後像這樣列印

塊 f1
PCO Blockf1
托盤:學校 SAM:XP
X/Y 複製
鍵 Z/Z

condition2:IF SAM :XPis found with D/D above D/D(FYI…D/D above row contains D/D) 然後列印

塊 f2
PCO Blockf2
托盤:學校 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 >> junk.txt。

我正在使用 HP-UX

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
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

引用自:https://unix.stackexchange.com/questions/348042