【问题标题】:Separate IPV4 and IPV6 addresses with Regular Expressions and Grok使用正则表达式和 Grok 分隔 IPV4 和 IPV6 地址
【发布时间】:2016-11-06 18:15:56
【问题描述】:

我正在尝试为一些传入的日志文件构建 Grok 模式。我在日志消息中有一个字段,可能看起来像以下两种:

IP Address: (192.168.1.100),
IP Address: (192.168.1.100, 2001:0db8:85a3:0000:0000:8a2e:0370:7334),

处理第一个示例非常简单,我定义了一个名为 IP2 的新 IP 模式,以避开括号 \((?:%{IP})\) 并最终得到如下内容:

Example Core RegEx Patterns:
IPV6 ((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?
IPV4 (?<![0-9])(?:(?:[0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])[.](?:[0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])[.](?:[0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])[.](?:[0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5]))(?![0-9])
IP (?:%{IPV6}|%{IPV4})
IP2 \((?:%{IP})\)

Grok Pattern for Field:
IP Address: %{IP2:ipv4_address},

我试图弄清楚当 IPv4 和 IPv6 地址都出现时如何创建正则表达式模式和 Grok 模式。我可以始终生成 IPv6 字段,如果它不存在,它只是空的。

【问题讨论】:

  • 我想你在找\(%{IPV4:ipv4_address}(?:,\s*%{IPV6:ipv6_address})?\)
  • 它是否按预期工作?如果缺少 IPV6 字段将为空。
  • 太完美了!非常感谢!

标签: regex logstash-grok grok graylog


【解决方案1】:

您需要使用可选组:

\(%{IPV4:ipv4_address}(?:,\s*%{IPV6:ipv6_address})?\)
                      ^^^                        ^^ 

细分

  • \( - 一个开放的(
  • %{IPV4:ipv4_address} - IPV4 模式
  • (?: - 可以出现 1 或 0 次的可选组的开始
    • , - 逗号
    • \s* - 零个或多个空格
    • %{IPV6:ipv6_address} - IPV6 模式
  • )? - 可选组的结尾(请注意,? 是一个匹配 1 次或 0 次出现的量化子模式的量词)
  • \) - 关闭)

【讨论】:

  • 很高兴它对你有用。如果我的回答对您有帮助,请考虑接受答案并点赞。