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


35

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

  grep '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' file

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

1.1.1.1.1 

要么

192.1.1.1.160

如何匹配有效的 IP和只有4个八位字节的IP地址?我也可以使用Perl –单行语法解决方案(如果grep不起作用)。


4
它也会匹配999.999.999.999
cyrus

4
因此,您只想grep IPv4地址,吗?
Arjan 2010年

5
从技术上讲,诸如IP地址之类的地址192.1.4097是有效的,并已被Linux glibc和Windows接受。
grawity 2010年

1
啊,我不知道ping 2130706433,在OS X上:PING 2130706433 (127.0.0.1): 56 data bytes
Arjan 2010年

1
@Arjan:0x7f.10177.1
grawity

Answers:


56

尝试这个:

grep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' /etc/hosts

匹配从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

您只会获得IP地址

注意:
在solaris上,egrep可能会做。


我尝试grep'\ b \ d {1,3} \。\ d {1,3} \。\ d {1,3} \。\ d {1,3} \ b'/ etc / hosts但我什么
都没

1
@jennifer,您需要启用扩展的正则表达式:(grep -E <pattern> <file>或仅打印匹配项:grep -Eo <pattern> <file>
Arjan 2010年

像这样 ?的grep -E '\ B \ d {1,3} \ \ d {1,3} \ \ d {1,3} \ \ d {1,3} \ B'/ etc / hosts中

3
@udo:可以匹配,1.1.1.1.1但是它.1在输出中隐藏了最后一个,我看不到它如何提供帮助。
cyrus

1
您的正则表达式与10.0.0.1不匹配
Stefan Seidel 2012年

10

这个怎么样:

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

真好!(这也返回192.1.1.1.160192.1.1.1,我认为这对提问者是很好的。)
Arjan 2010年

2
如果确实需要一致的IP地址,则这是唯一有可能接近完成的解决方案类型。当我看到这个问题时,我只是想“我不会用十英尺的标准正则表达式杆来碰它”。警告,到处都是警告:-)。
丹尼尔·安德森

5

-w / --word-regexp 

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


5

要仅精确查找具有4个八位位组的匹配项(不包括1.1.1.1.1之类的东西),请使用以下命令:

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

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


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;

3

有点棘手,但应该可以:

( X='\([0-9]\{1,2\}\|1[0-9]\{2\}\|2[0-4][0-9]\|25[0-5]\)' ; grep "\([^\.]\|^\)$X\.$X\.$X\.$X\([^\.]\|$\)" file )

怎么样127.000.000.001呢?;-)
Arjan

据我所知,IP没有填充零。
cyrus

1
嗯,ping 127.000.000.001肯定可以在我的Mac上使用。但是然后:我才知道,即使ping 2130706433产生同样的结果。:-)糟糕,ping 00127.00000.00000.00001翻译成87.0.0.1。奇怪...或者八进制?是的,八进制肯定可以,所以我猜您对前导零是正确的。
Arjan

是的,00127(八进制)= 87(十进制)。当然,它们都是有效的IP,但是我想那不是代表它们的标准方法。无论如何,询问者都没有要求。
cyrus

0

grep -E'^((25 [0-5] | 2 [0-4] [0-9] | [1]?[1-9] [0-9]?)。){3}(25 [ 0-5] | 2 [0-4] [0-9] | [1]?[1-9]?[0-9])$'

修改版的Arnaud B.的答案。

此表达式将不匹配前导0的IP地址。例如,它将不匹配192.168.1.01。此表达式将不匹配具有4个以上八位字节的IP地址。例如,它与192.168.1.2.3不匹配


这也不匹配127.0.0.1。
克里斯·查拉巴鲁克

0

egrep "^([0-9]{1,3}\.){3}[0-9]{1,3}" /etc/hosts 习惯于在一行的开头匹配IP地址。也可以在不使用的情况下使用该地址,^以允许在IP地址之前使用空格或其他字符。

[0-9]{1,3} --> this matches a number between 1 and 999.
\. --> this is to add the dot.
([0-9]{1,3}\.){3} --> get a number with a dot 3 times.
[0-9]{1,3} --> finally add the fourth number.

0

长正则表达式的简短版本:

egrep '([1-2]?[0-9]{0,2}\.){3,3}[1-2]?[0-9]{0,2}' 

请使用grep -E或egrep以适合您的操作系统版本


2
欢迎超级用户。这个问题已经有几个很好的答案。为了帮助人们理解他们之间的差异,请编辑您的答案并解释什么使它更好/与其他人不同。
马塔·朱哈斯(MátéJuhász)2015年

此表达式未考虑到8.8.8.8等合法echo "8.8.8.8" | grep -Eo '([1-2][0-9]{0,2}\.){3,3}[1-2][0-9]{0,2}'
ip


0

用于匹配TCL中的IP地址的正则表达式

设置一个“ 192.168.10.25”

if {[regexp
{^(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$} $a]} 
{
    puts "yes"
}

-1

这是在AIX中对ksh和ksh93有用的内容:

ip =

[[$ ip == [0-9] @(“” | [0-9])@(“” | [0-9])。[0-9] @((“ | [0-9])) @(“” | [0-9])。[0-9] @(“” | [0-9])@(“” | [0-9])。[0-9] @(“ || [0-9])@(“” | [0-9])]] && echo OK || echo NOK可以对上述内容进行修改,以便将提供的IP“过滤”为所需的任何模式。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.