温馨提示:本文翻译自stackoverflow.com,查看原文请点击:bash - Regex to match IP addresses
bash regex

bash - 正则表达式以匹配IP地址

发布于 2021-02-03 06:02:42

我想匹配traceroute通过正则表达式在输出中找到的IP地址我不尝试验证它们,因为它足够安全,可以假定它traceroute是有效的(即,不输出类似的信息999.999.999.999。我正在尝试以下正则表达式:

([0-9]{1,3}.?){4}

我正在regex101中对其进行测试,它确实可以验证IP地址。但是,当我尝试

echo '192.168.1.1 foobar' | grep '([0-9]{1,3}.?){4}' 

我什么都没有。我想念什么?

查看更多

提问者
mrbolichi
被浏览
0
2020-06-20 17:12

您使用了POSIX ERE模式,但没有通过使用POSIX ERE样式的-E选项grep因此,grep使用POSIX BRE代替,您需要转义{n,m}量词(...)并将其解析为特殊的正则表达式运算符。

请注意,您需要转义a,.以便它只能与文字点匹配。

要使模式以grep您希望的方式工作,可以使用:

grep -E '([0-9]{1,3}\.?){4}'      # POSIX ERE
grep '\([0-9]\{1,3\}\.\?\)\{4\}'  # POSIX BRE version of the same regex

观看在线演示

但是,此正则表达式也将匹配几个数字的字符串,因为.可选。

您可以通过展开模式来解决它

grep -E '[0-9]{1,3}(\.[0-9]{1,3}){3}'      # POSIX ERE
grep '[0-9]\{1,3\}\(\.[0-9]\{1,3\}\)\{3\}' # POSIX BRE

参见另一个演示

基本上,它匹配:

  • [0-9]{1,3} -1至3次出现的任何ASCII数字
  • (\.[0-9]{1,3}){3} -3次出现:
    • \. -文字 .
    • [0-9]{1,3} -1至3次出现的任何ASCII数字

为了确保只匹配有效的IP,您可能需要使用更精确的IP匹配正则表达式

grep -E '\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}\b' # POSIX ERE

请参阅此在线演示

您可能会进一步调整单词边界(可以是\</\>\b等等)。

要提取IP使用-o选项,请使用grepgrep -oE 'ERE_pattern' file/ grep -o 'BRE_pattern' file