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