linux中匹配正确的ip地址

Posted 1996

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux中匹配正确的ip地址相关的知识,希望对你有一定的参考价值。

1.假设IP地址是规范的,没有出错误的

sed -n  "/[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}/p" test

这种匹配存在明显的问题,在正则匹配的过程中,若是出现300,1,255,0;192.168.0.  ;192.168,1.1.1这种错误的IP地址,任然会被匹配到

 

2.IP地址规范与否未知的情况下匹配

在这里,逛论坛的时候看见一位老哥踩了一个坑,这里做 一下记录

sed -n -r   "/((([0-9]{1,2})|(1[0-9]{2})|(2[0-4][0-9])|(25[0-5])).){3}(([0-9]{1,2})|(1[0-9]{2})|(2[0-4][0-9])|(25[0-5]))/p" test

这个正则在匹配前24位 的时候是没有问题的,然而,在匹配最后8位的时候,会存在一个让人很无奈的问题。当你匹配192.168.1.300的时候,是可以匹配到的。为什么呢?我的正则里面可是完全没有大于 255的情况的啊。

原因如下:

在进行前24位匹配的时候使用的是 : 

(([0-9]{1,2})|(1[0-9]{2})|(2[0-4][0-9])|(25[0-5])). 

 

 若是数字之后没有点号,那么是不会匹配成功的,但是,在匹配最后8位的时候,使用的是

(([0-9]{1,2})|(1[0-9]{2})|(2[0-4][0-9])|(25[0-5]))

当它匹配到30的时候,正则匹配就结束了,这就是为什么会匹配到300的原因 

 

为了解决匹配到大于255的问题,可以在上一个sed的结果之后,利用awk对IP的最后8位进行过滤

sed -n -r   "/((([0-9]{1,2})|(1[0-9]{2})|(2[0-4][0-9])|(25[0-5])).){3}/p" test_1 | awk -F "." {if($4<255) print $0}

 

 

 



以上是关于linux中匹配正确的ip地址的主要内容,如果未能解决你的问题,请参考以下文章

如何用正则表达式匹配出如下代码中的IP地址跟IP地址归属地?

Linux grep 命令正则匹配IP地址

Linux基本命令之正则表达式取ip地址

如何用正则表达式检测ip是不是正确,求详解

如何修改Linux环境下的Oracle的IP地址配置?

linux静态ip怎么设置