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\}$'