【问题标题】:Extract fields of Apache Web Log using PCRE Regex使用 PCRE Regex 提取 Apache Web Log 的字段
【发布时间】:2015-10-04 17:53:50
【问题描述】:

使用 PRCE 正则表达式,我想捕获不同 apache 博客的每个字段。这些日志的结构类似于这个例子:

aaa bbb "cc c" ddd "eee" fff

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

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

我的问题是我想要一个万能的解决方案,例如带有量词 - 像这样: (?:((aa|bb|"cc"|dd)\s){1,})

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

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

【问题讨论】:

  • 是否可以使用解析器(在您的情况下是空格分隔的值)而不是正则表达式来解决问题?

标签: regex apache logging pcre capturing-group


【解决方案1】:

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

假设你使用 perl 本身,让我们研究一下字段是由什么组成的?

  1. 以可选的打开双引号 " 开头
  2. 任何字符不是双引号
  3. 结束"

在正则表达式中,上面的表达式如下所示:

"?[^"]+"?

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

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

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

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

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

上面的工作是因为 m// 操作符在列表上下文中

【讨论】:

  • 感谢您的回答。我尝试在名为 splunk 的工具中应用正则表达式。它需要 PCRE,您可以将组分配给字段,例如USER_IP=$1, APACHE_REQUEST=$2 等等。所以召回不是问题。但是对于您的第一个正则表达式部分 "?[^"]+"? - 请注意,某些日志可能根本不包含双引号,特别是如果它们只有简单的条目而根本没有空格。另外,我不知道如何您将空格作为分隔字符来处理。您能否说明一个完整的正则表达式来解决问题?非常感谢。
猜你喜欢
  • 1970-01-01
  • 2021-03-28
  • 1970-01-01
  • 2018-03-06
  • 1970-01-01
  • 2016-03-07
  • 2012-05-18
  • 1970-01-01
  • 2019-02-16
相关资源
最近更新 更多