我想从仅包含某人连接的有效 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。在这里,您需要先开发一个代码来将日志条目拆分为多个部分。