Text-Processing
如果在 Start —End 中找到多個字元串,則列印整個 Block
我的原始日誌文件類似於生產日誌,我對此進行了調整,
塊 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