使用正则表达式匹配日志文件行时的可选字段

时间:2016-10-28 01:01:56

标签: regex hadoop logging hive hive-serde

我正在尝试使用RegexSerDe使用正则表达式解析Web日志。它的工作原理是将每个正则表达式组与表中的列匹配,如果正则表达式组为空,则为该列分配空值。

我在将日志行与缺少的字段匹配时遇到问题。此日志中有两种行:

<134>2016-10-23T23:59:59Z cache-iad2134 fastly[502801]: 52.55.94.131 "-" "-" Sun, 23 Oct 2016 23:59:59 GMT GET /apps/events/2016/10/11/3062653/?REC_ID=3062653&id=0 200

<134>2016-10-23T23:59:59Z cache-dfw1835 fastly[502801]: 1477267199

我编写了以下正则表达式,它将第一种类型的行与所有字段匹配:

^(\\S+) (\\S+) (\\S+) (\\S+) "(\\S+)" "(\\S+)" (.*) (\\d{3})

但我玩?以获得正则表达式,可以选择忽略前4个字段之后的字段,但一直搞乱列。

有关如何在不更改组数量的情况下添加?的任何建议(以便解串器不会咳嗽)?或者你建议做任何其他方式吗?

1 个答案:

答案 0 :(得分:1)

在前4个字段后面的所有字段周围放置一个非捕获组,并使其成为可选字段。

^(\\S+) (\\S+) (\\S+) (\\S+)(?: "(\\S+)" "(\\S+)" (.*) (\\d{3}))?

?:放在组的开头会使其无法捕获。因此,该组不会影响捕获的组数。