1

我正在尝试对我的访问日志文件进行表述,为此我只需逐行读取访问日志文件并从每一行中提取有用的信息,最后将它们添加到数据库中。

例如,一条线看起来像这样。

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地址。(使用这个

我要提取

  1. 这个请求值- GET /p/V4ZkA5d074CTy_vbFa7nLw,1385070078,IneedThisInteger/12.txt HTTP/1.1

  2. 来自上述部分的这个整数值- IneedThisInteger

  3. 这个状态部分-200

  4. 这个字节部分-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"

所以我真的需要一种稳定的方法来从每一行获取这些值。我该怎么做?

4

2 回答 2

1

假设您总是有 GET 请求,这应该可以解决问题

"(GET /.*?/.*?,\d+,(\d+)/.*?)"\s"(\d+)"\s"(\d+)"

有关表达式的解释,请参见regex101.com 。

于 2013-11-21T22:20:22.300 回答
1

这应该可以解决问题:

^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}).*?"(.*?/p/.*?,\d+,(\d+).*?)" "(\d+)" "(\d+)".*$

这是一个要演示的小提琴:http ://www.rexfiddle.net/3sDwWut

出于测试目的,我用实际数字替换了您的“我需要这个整数”,并且还稍微随机化了“字节”和 IP 地址。这些是捕获,按顺序:

  1. 知识产权
  2. 请求(例如GET xxx HTTP/1.1
  3. 您想要的 URL 中的整数
  4. HTTP 状态
  5. 字节数
于 2013-11-21T22:28:46.743 回答