正则表达式匹配IP地址

mrb*_*chi 3 regex bash

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

([0-9]{1,3}.?){4}
Run Code Online (Sandbox Code Playgroud)

我在regex101中测试它,它确实验证了一个IP地址.但是,当我尝试

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

我一无所获.我错过了什么?

Wik*_*żew 6

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

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

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

(注意你需要转义一个,grep以便它只能匹配一个文字点.)

查看在线演示.

相同正则表达式的POSIX BRE版本:

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
Run Code Online (Sandbox Code Playgroud)

但是,此正则表达式也将匹配几个数字的字符串,因为它.是可选的.您可以通过展开模式来解决它

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
Run Code Online (Sandbox Code Playgroud)

或BRE版本:

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

另一个演示.

基本上,它匹配:

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

您可以使用单词边界(可以是\</ \>\b)等进一步调整它.

实际上,您可能希望使用更精确的IP匹配正则表达式.