我试图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)
我一无所获.我错过了什么?
您使用了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匹配正则表达式.
| 归档时间: |
|
| 查看次数: |
6954 次 |
| 最近记录: |