我可以使用什么正则表达式来匹配 IP 地址?

jen*_*fer 36 grep regex ip-address

使用以下grep语法,我想匹配文件中的所有 IP 地址(来自ksh脚本)

  grep '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' file
Run Code Online (Sandbox Code Playgroud)

问题:它还匹配具有超过 4 个八位字节的单词 (IP):

1.1.1.1.1 
Run Code Online (Sandbox Code Playgroud)

或者

192.1.1.1.160
Run Code Online (Sandbox Code Playgroud)

如何将有效IP 和仅具有 4 个八位字节的 IP 地址匹配?如果grep不起作用,我也可以使用 Perl——一种单行语法解决方案。

udo*_*udo 60

尝试这个:

grep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' /etc/hosts
Run Code Online (Sandbox Code Playgroud)

匹配从0.0.0.0到的所有表达式999.999.999.999

grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' /etc/hosts
Run Code Online (Sandbox Code Playgroud)

你只会得到 IP 地址

注意:
在solaris 上egrep可能会完成这项工作。

  • @udo:嗯,这匹配 `1.1.1.1.1`,但它隐藏了输出中的最后一个 `.1`,我看不出它有什么帮助。 (3认同)

Joe*_*nte 11

这个怎么样:

perl -MRegexp::Common=net -ne '/($RE{net}{IPv4})/ and print "$1\n"' /etc/hosts
Run Code Online (Sandbox Code Playgroud)

  • 如果确实需要一致的 IP 地址,那么这是唯一一种有可能接近完成的解决方案。当我看到这个问题时,我只是想“我不会用十英尺的标准正则表达式杆去碰它”。警告,警告无处不在:-)。 (2认同)

小智 5

-w / --word-regexp 
Run Code Online (Sandbox Code Playgroud)

标志grep使其仅在单词边界上匹配,这意味着您的匹配必须由空格包围或在行的开头/结尾开始/结束!


小智 5

if [ ` echo $ip | '^((25[0-5]|2[0-4][0-9]|[01]?[1-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[1-9][0-9]?)$'  | grep -o "\." | wc -l` -eq 1 ];
then ipv4=true;
else 
ipv4=false;
Run Code Online (Sandbox Code Playgroud)


Ste*_*del 5

要仅查找与 4 个八位字节完全匹配的匹配项(不包括 1.1.1.1.1 之类的内容),请使用以下命令:

grep -P '(?<=[^0-9.]|^)[1-9][0-9]{0,2}(\.([0-9]{0,3})){3}(?=[^0-9.]|$)'
Run Code Online (Sandbox Code Playgroud)

它永远不应该检测非 IP 地址。该表达式可能会更复杂以验证更多内容,但这应该适用于大多数情况。它不会匹配前面的 0,因为 010.1.12.1 不是写入 IP 地址的常用方法。