2014-01-07 74 views
2

的這種模式在日誌文件中正則表達式來拉款款走出日誌文件

event y: 
event x: specific data A 
event y: 
event z: count = 1 (or 2, 3, etc) 
event y: 
event x: specific data B 
event y: 
event z: count = 0 
event y: 

通過X Y Z表示事件名稱是靜態的。

我想提取出現在「count = 0」之前的「特定數據」。它足夠接近我得到提取這些線。

event x: specific data B 
event y: 
event z: count = 0 

我能做的最好的是

event x.+?count = 0 

(中的EditPad贊成使用多選項),但是,這給了我太多的

event x: specific data A 
event y: 
event z: count = 1 (or 2, 3, etc) 
event y: 
event x: specific data B 
event y: 
event z: count = 0 

即使它不貪婪,比賽回到「太遠」

我怎樣才能得到以下幾行?

event x: specific data B 
event y: 
event z: count = 0 

回答

2

你需要更加明確,例如:

event x:(?>[^ec]++|\B[ec]|e(?!vent x:)|c(?!ount = 0))++count = 0 

圖案的詳細資料:

event x: 
(?>    # open an atomic group 
    [^ec]++  # all characters except e and c one or more times 
    |    # OR 
    \B[ec]   # e or c not precedent by a word boundary 
    |    # OR 
    e(?!vent x:) # e not followed by "vent x:" 
    |    # OR 
    c(?!ount = 0) # c not followed by "ount = 0" 
)++    # repeat the atomic group one or more times 
count = 0   
2

如果使用grep是它有一個-B n參數,告訴它包括n選項在匹配你給它的字符串/表達式的行之前的行。所以grep -B 2 "count = 0"應該這樣做。

另外,如果你想只使用正則表達式,試試這個:

(?:^.*$\s){2}^.*count = 0 

這可以分爲兩個位:(?:^.*$\s){2}^.*count = 0

第二部分是相當明顯的正則表達式「的包含'count = 0'的行。

第一部分是「包括前兩行」的正則表達式,其中^.*$\s是「一行」的正則表達式。 (具體地說,一行的開始,後面是一行和一個空格字符之前的任意數量的字符(必要的是\n