从一行中提取内容


Extract contents from a line

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

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

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"

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

这应该可以做到:

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

下面是一把小提琴:http://www.rexfiddle.net/3sDwWut

出于测试目的,我用实际数字替换了您的"我需要这个整数",并对"字节"和IP地址进行了一点随机化。这些是捕获,按顺序:

  1. IP
  2. 请求(例如GET xxx HTTP/1.1
  3. 您想要的URL中的整数
  4. HTTP状态
  5. 字节计数

假设您总是有GET请求,这应该可以完成

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

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