shell 匹配 ip地址

shell中正则表达式基本元素有

^ 只匹配行首

$ 只匹配行尾

* 匹配0或多个

[]  匹配[]内字符,只要匹配其中一个

转义特殊字符为普通字符,特殊字符有$ . ' " * [ ] ^ | ( ) + ?

. 匹配任意单字

pattern{n} 匹配n次出现的pattern

pattern{n,}  匹配最少出现n次的pattern

pattern{n,m} 匹配出现次数在n与m之间的pattern

 

现在需要匹配型如xxx.xxx.xxx.xxx的ip地址,构造测试文件 ip.txt

10.1.1.1
192.168.0.1
192.168.0.101
255.255.255.255
999.0.0.1
1.0.0.500
a.0.0.0
0.b.0.0
1.1.1
2.2
1
0.0.0.0

 

基本思路就是要每个点之间的元素为整数,最多为3位整数[0-9]{1,3},然后用 . 拼接起来,加上^和$更精确的限制匹配对象


cat ip.txt |grep '^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$'

结果为

10.1.1.1
192.168.0.1
192.168.0.101
255.255.255.255
999.0.0.1
1.0.0.500
0.0.0.0

这里精度不够,需要严格限制整数为1-255(第一个元素不能为0,后面的可以为0),即0-9 10-99 100-199 200-249 250-255

([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])    注意|和()转义,另外|分割的元素要用()括住,若带-E参数指定为扩展正则的形式则不需用转义

然后后面3个元素只要稍改下范围到0-255,简单的拼接起来

cat ip.txt |grep '^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]).([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]).([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]).([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$'

结果如下

10.1.1.1
192.168.0.1
192.168.0.101
255.255.255.255

当然更简洁的写法,记得.后面的元要()括起来

cat ip.txt |grep '^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(.([0-9]|([1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$'

 

原文地址:https://www.cnblogs.com/opama/p/4314554.html