我正在尝试短语化我的访问日志文件,为此,我只需逐行读取访问日志文件并从每行提取有用的信息,最后将它们添加到数据库中。
例如,一条线看起来是这样的。
124.99.152.202 - naveen [22/Nov/2013:10:41:17 +1300] "GET /p/V4ZkA5d074CTy_vbFa7nLw,1385070078/IneedThisInteger/12.txt HTTP/1.1" "200" "3" "-" "Mozilla/5.0" "-"
我只知道如何提取IP地址。(使用此)
我想提取
该请求值-
GET /p/V4ZkA5d074CTy_vbFa7nLw,1385070078,IneedThisInteger/12.txt HTTP/1.1
以上部分的整数值-
IneedThisInteger
此状态部分-
200
此字节部分-
3
有时请求URL更改它是最后一部分,
"GET /p/V4ZkA5d074CTy_vbFa7nLw,1385070078,IneedThisInteger/FOLDER/12.txt HTTP/1.1"
"GET /p/V4ZkA5d074CTy_vbFa7nLw,1385070078,IneedThisInteger/FOLDER/ANOTHER FOLDER/12.txt HTTP/1.1"
"GET /p/V4ZkA5d074CTy_vbFa7nLw,1385070078,IneedThisInteger/FOLDER/ANOTHER FOLDER/HEREIS-ANOTHER-FOLDER-AND-SO-ON/12.txt HTTP/1.1"
所以我真的需要一种稳定的方法来从每一行中获得这些值。我该怎么做?
这应该可以做到:
^('d{1,3}'.'d{1,3}'.'d{1,3}'.'d{1,3}).*?"(.*?/p/.*?,'d+,('d+).*?)" "('d+)" "('d+)".*$
下面是一把小提琴:http://www.rexfiddle.net/3sDwWut
出于测试目的,我用实际数字替换了您的"我需要这个整数",并对"字节"和IP地址进行了一点随机化。这些是捕获,按顺序:
- IP
- 请求(例如
GET xxx HTTP/1.1
) - 您想要的URL中的整数
- HTTP状态
- 字节计数
假设您总是有GET请求,这应该可以完成
"(GET /.*?/.*?,'d+,('d+)/.*?)"'s"('d+)"'s"('d+)"
有关表达式的解释,请参见regex101.com。