2015-03-18 65 views
0

我正在嘗試編寫一個正則表達式來匹配擴展公用日誌格式。我有一個表達式來匹配大多數日誌條目,但在列出多個主機時會失敗。正則表達式與多主機匹配擴展公用日誌格式

這是我目前的表現:

([^ ]*) ([^ ]*) ([^ ]*) \[([^]]*)\] "([^"]*)" ([^ ]*) ([^ ]*) "([^"]*)" "([^"]*)" 

此匹配成功的標準日誌條目。例如:

24.58.227.240 - - [22/Sep/2011:00:00:00 +0000] "GET /rss/merchant/airsoftpost.com HTTP/1.1" 200 1880 "-" "Apple-PubSub/65" 

然而,一些日誌條目包含由逗號分隔的多個主機IP地址:

10.64.233.43, 69.171.229.245 - - [22/Sep/2011:00:00:00 +0000] "GET /view/thesanctuary.co.uk HTTP/1.1" 206 7289 "-" "facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)" 

有人能幫助我解決我的表達式匹配任意數量的主機對於給定的日誌項?

謝謝。

回答

1

按照你的正則表達式,您可以更改:

([^ ]*) ([^ ]*) ([^ ]*) \[([^]]*)\] "([^"]*)" ([^ ]*) ([^ ]*) "([^"]*)" "([^"]*)" 

([^-]*) ([^ ]*) ([^ ]*) \[([^]]*)\] "([^"]*)" ([^ ]*) ([^ ]*) "([^"]*)" "([^"]*)" 
    ^--- here, match until first dash 

的想法是隻改變第一組:

([^ ]*) ---> matches until the first space (change this) 
([^-]*) ---> matches until the first hyphen 
1

作爲一個選項,試試這個正則表達式:

([\d.\s,]*) ([^ ]*) ([^ ]*) \[([^]]*)\] "([^"]*)" ([^ ]*) ([^ ]*) "([^"]*)" "([^"]*)"

第一個捕獲組現在將捕獲所有數字,句點,(白色)空格以及任意數量的重複。

請參閱working demo