我是正则表达式的新手。
如果我从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+) \"([^\"]+)\" \"([^\"]+)\""
但并非所有日志条目看起来都与上面的条目完全相同,有时它包含9个字段,有时是7个。 9场准备的例子:
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移动/ 8C148 Safari / 6533.18.5“
但是,我只对IP,日期和时间以及URL感兴趣。 是否存在仅从日志条目中搜索匹配条目的模式,而不管其字段的编号是什么?
答案 0 :(得分:6)
您在示例中提供的行是伪标准combined log format。这种9字段格式扩展了广泛使用的common log format和另外两个字段:referrer和user-agent。
通过在正则表达式中将最后两个字段设为可选字段,您可以匹配常用或组合格式的行:
"^(\\S+) (\\S+) (\\S+) \\[(.*?)\\] \"(.*?)\" (\\S+) (\\S+)( \"(.*?)\" \"(.*?)\")?"
捕获组是:
此模式故意对日志消息中特定字段的内容不具体。通常,在解析日志时,您需要提取任何内容,而不是尝试验证规范。