流集中的正则表达式
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)}
您好,我想使用 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)}