我是正则表达式的新手.
如果我有tomcat的访问日志文件中的以下行:
123.45.67.89 - - [27/Oct/2000:09:27:09 -0400] \"GET /java/javaResources.html HTTP/1.0 \"200 10450 \" - \"\"Mozilla/4.6 [en]( X11; U; OpenBSD 2.8 i386;导航)\""
以下模式适用于与上面完全相同的条目:
"^([\\d.]+) (\\S+) (\\S+) \\[([\\w:/]+\\s[+\\-]\\d{4})\\] \"(.+?)\" (\\d{3}) (\\d+) \"([^\"]+)\" \"([^\"]+)\""
Run Code Online (Sandbox Code Playgroud)
但并非所有日志条目看起来都与上面的条目完全相同,有时它包含9个字段,有时候是7个字段的示例:
82.132.139.79 - - [14/Jul/2011:18:52:44 +0100]"GET /~roger/cpp/introans.htm HTTP/1.1"200 11195"http://www.dcs.bbk.ac. uk/~roger/cpp/intro3.htm""Mozilla/5.0(iPhone; U; CPU iPhone OS 4_2_1,如Mac OS X; en-us)AppleWebKit/533.17.9(KHTML,与Gecko一样)Version/5.0.2 Mobile/8C148 Safari/6533.18.5"
但是,我只对IP,日期和时间以及URL感兴趣.是否存在仅从日志条目中搜索匹配条目而不管其字段编号的模式?
您在示例中提供的行是伪标准组合日志格式.这种9字段格式扩展了广泛使用的常见日志格式,增加了两个字段:referrer和user-agent.
通过在正则表达式中将最后两个字段设置为可选,您可以匹配常用或组合格式的行:
"^(\\S+) (\\S+) (\\S+) \\[(.*?)\\] \"(.*?)\" (\\S+) (\\S+)( \"(.*?)\" \"(.*?)\")?"
Run Code Online (Sandbox Code Playgroud)
捕获组是:
此模式故意对日志消息中特定字段的内容不具体.通常,在解析日志时,您希望提取任何内容,而不是尝试验证规范.
| 归档时间: |
|
| 查看次数: |
2340 次 |
| 最近记录: |