我正在尝试编写一个正则表达式来匹配扩展的通用日志格式。我有一个表达式来匹配大多数日志条目,但是当列出多个主机时它会失败。
这是我目前的表达方式:
([^ ]*) ([^ ]*) ([^ ]*) \[([^]]*)\] "([^"]*)" ([^ ]*) ([^ ]*) "([^"]*)" "([^"]*)"
这成功匹配标准日志条目。例如:
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)"
有人可以帮我修复我的表达式以匹配给定日志项的任意数量的主机吗?
感谢。
答案 0 :(得分:1)
关注正则表达式后,您可以更改:
([^ ]*) ([^ ]*) ([^ ]*) \[([^]]*)\] "([^"]*)" ([^ ]*) ([^ ]*) "([^"]*)" "([^"]*)"
到
([^-]*) ([^ ]*) ([^ ]*) \[([^]]*)\] "([^"]*)" ([^ ]*) ([^ ]*) "([^"]*)" "([^"]*)"
^--- here, match until first dash
这个想法只是改变第一组:
([^ ]*) ---> matches until the first space (change this)
([^-]*) ---> matches until the first hyphen
答案 1 :(得分:1)
作为一种选择,试试这个正则表达式模式:
([\d.\s,]*) ([^ ]*) ([^ ]*) \[([^]]*)\] "([^"]*)" ([^ ]*) ([^ ]*) "([^"]*)" "([^"]*)"
第一个捕获组现在将捕获所有数字,句点,(白色)空格,任意数量的重复。
请参阅working demo。