使用PCRE Regex提取Apache Web Log的字段

时间:2015-07-15 15:27:55

标签: regex apache logging pcre capturing-group

使用PRCE Regex,我想捕获不同apache博客的每个字段。这些日志的结构就像这个例子:

aaa bbb“cc c”ddd“eee”fff

每个区域都由一个空格分隔。但是字段也可能包含空格,在这种情况下,它们在字段的开头和结尾用引号括起来(“cc c”)。不包含空格的字段我也在字段的开头和结尾有引号(“eee”)。

结果应该为每个字段都有一个捕获组,因此对于应该是的示例: 第1组:aaa 第2组:bbb 第3组:“cc c” 第4组:ddd 第5组:“eee” 第6组:fff

我的问题是我想要一个通用的解决方案,例如量词 - 有类似的东西: (?:((AA | BB | “CC” | DD)\ S){1,})

但这里的量词总是在aaa重复。

非常感谢整洁,有效的解决方案。

1 个答案:

答案 0 :(得分:0)

我理解您正在使用PCRE,问题是您使用什么实际工具来处理正则表达式。

假设你自己使用perl,让我们研究一个字段是由什么构成的?

  1. 以可选的打开双引号"
  2. 开头
  3. 任何字符双引号
  4. 结束"
  5. 在正则表达式中,上面的表达式如下所示:

    "?[^"]+"?
    

    然后,您可以选择量化上述内容并指定您拥有的列数:

    ("?[^"]+"?){1,6}
    

    以上说允许1到6个这样的字段,问题就变成了如何应用/使用正则表达式?这取决于工具,在它看起来像perl:

    @groups = $apache_line =~ m/("?[^"]+"?)/g
    

    从这里$ groups [0]会有aaa $ group [1]:bbb ... $ group [5]:fff

    上述方法有效,因为m //运算符位于列表上下文