查找 IPv6 的最简单方法/与 IPv6 匹配的最短正则表达式(无效地址没什么大不了的)

查找 IPv6 的最简单方法/与 IPv6 匹配的最短正则表达式(无效地址没什么大不了的)

我想从仅包含某人连接的有效 IPv6 地址的日志文件中 grep IPv6 地址(并​​且还包含带有 IPv4 的行和许多其他没有任何 IP 的行,例如 /var/log/secure)。

因此,此正则表达式是否只匹配真正的 RFC 有效 IPv6 (例如来自的大量正则表达式)并不那么重要https://stackoverflow.com/questions/53497/regular-expression-that-matches-valid-ipv6-addresses确实如此,但它应该匹配所有与 IPv6 有点相似的东西,这样它就不会提供太多的误报,并且应该尽可能短,以便于记住和输入它。

答案1

为了快速回答,我会说:

egrep "(::)?[0-9a-fA-F]{1,4}(::?[0-9a-fA-F]{1,4}){1,7}(::)?"

但你必须假设地址至少包含两个“部分”,例如: ff00:3456::ff00::3456,这个:ff00::将不会被匹配。

我发现的其他解决方案是这个正则表达式:

^(\:\:)?[0-9a-fA-F]{1,4}(\:\:?[0-9a-fA-F]{1,4}){0,7}(\:\:)?$

但是,这会捕获诸如“aaaa”、“abc”字符串之类的误报,因此必须进行额外的验证,例如:

`^.*\:.*\:.*$`

在这种情况下,bash 脚本片段如下所示:

if [[ "$col" =~ ^(\:\:)?[0-9a-fA-F]{1,4}(\:\:?[0-9a-fA-F]{1,4}){0,7}(\:\:)?$ ]] && \
   [[ "$col" =~ ^.*\:.*\:.*$ ]] ; then
    echo "IPv6 match"
else
    echo "No match"
fi

这是为了验证是否$col代表 IPv6。在这里,您需要先开发一个代码来将日志条目拆分为多个部分。

相关内容