流集中的正则表达式

Regex in Streamsets

您好,我想使用 Streamsets 破坏日志文件。日志就像,

Deny tcp src dmz:77.77.77.7/61112 dst dmz:55.55.56.57/139 by access-group "outside_access_in" [0x8b3ecfdc, 0x0]

日志中可能还有 2 个以上的 IP,我正在尝试从我的日志中捕获唯一的第一个和第二个 IP 地址。据记载,Streamsets 使用 Java REGEX 模式。

到目前为止,我在 Streamsets 的 Expression Evaluator 处理器中所做的是,

${str:regExCapture(record:value('/Message'),'(\d+[.]\d+[.]\d+[.]\d+/?\d*)', 1)}

知道如何获取第二个 IP 吗?

您可以使用

${str:regExCapture(record:value('/Message'),'^(?:.*?(\d+(?:[.]\d+){3}(?:/\d+)?)){2}', 1)}

参见regex demo

详情

  • ^ - 字符串开头
  • (?:.*?(\d+(?:[.]\d+){3}(?:/\d+)?)){2} - 连续出现两次
    • .*? - 除换行字符外的任何 0+ 个字符,尽可能少
    • (\d+(?:[.]\d+){3}(?:/\d+)?) - 捕获组 1(其值将由 str:regExCapture 返回,因为最后一个参数设置为 1):
      • \d+ - 1+ 位数
      • (?:[.]\d+){3} - 三个 . 和 1+ 个数字
      • (?:/\d+)? - / 和 1+ 个数字的可选序列。

由于在一次匹配操作中捕获多个事件时会重写组中的内容,因此组 1 将仅包含第二个 IP 值。

请注意,更好(更安全、更精确)的 IP 模式是 (?:25[0-5]|2[0-4]\d|[0-1]?\d?\d)(?:\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3},参见 Extract ip addresses from Strings using regex。所以,你也可以把命令写成

 ${str:regExCapture(record:value('/Message'),'^(?:.*?\b((?:25[0-5]|2[0-4]\d|[0-1]?\d?\d)(?:\.(?:25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}(?:/\d+)?)){2}', 1)}

参见 another regex demo