网上有关于环视的解释,有些写的很长,很佩服这些这么耐心解释正则环视的大神(绝无讽刺之意),
但是我实在没有太多的耐心把这些内容看完,在此深深的鄙视下自己^-^
在此分享下我对正则环视的理解:
环视的作用:确定一个位置
下面看下一个从ifconfig中过滤ip地址的例子(获取下面红色标注的IP)
[root]# ifconfig
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:69954 errors:0 dropped:0 overruns:0 frame:0
TX packets:69954 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:5139078 (4.9 MiB) TX bytes:5139078 (4.9 MiB)
p4p1 Link encap:Ethernet HWaddr A4:1F:72:79:0C:8D
inet addr:10.84.22.21 Bcast:10.84.22.255 Mask:255.255.255.0
inet6 addr: fe80::a61f:72ff:fe79:c8d/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:121702347 errors:0 dropped:0 overruns:0 frame:0
TX packets:133507811 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:42562340126 (39.6 GiB) TX bytes:58317218304 (54.3 GiB)
方式1:ifconfig | grep -oP "[0-9]{1,3}\.[0-9]{1,3}"
只看这个正则就感觉比较“笨”,呵呵!这样的结果如下,但是不精确。
127.0.0.1
255.0.0.0
10.84.22.21
10.84.22.255
255.255.255.0
最后还要过滤下,只显示我们需要的两个IP,ifconfig |grep -oP "[0-9]{1,3}" | sed -n '1p;3p'
方式2:看下上面ifconfig显示的内容,我们就很容易发现两个IP前都有一个字串“inet addr:”
如果使用一种方法把要匹配的位置指定到“inet addr:”后面就好了,这时我们就可以用到正则的环视了...环视的使用场景就是这样...
现在我们重新写下这个语句:ifconfig | grep -oP "(?<=inet addr:)[0-9\.]+";这个黑色高亮的部分就是逆序环视了
所谓环视,就是找位置,顺序环视是找字串左面的位置,逆序环视是确定字串右面的位置,那上面的逆序环视确定的位置就是从“inet addr:”开始了...
上面语句就是匹配从“inet addr:”后面开始,由数字和“.”组成的字串,那就是要找的IP了。
执行结果是:[root]# ifconfig | grep -oP "(?<=inet addr:)[0-9\.]+"
127.0.0.1
10.84.22.21
方式3:如果我们只想要IP:10.84.22.21
我们很容易发现,这个IP是在字串“inet addr:”和“ Bcast”之间的,修改下上面的语句为:
ifconfig | grep -oP "(?<=inet addr:).*(?= Bcast)"
执行结果就是我们想要的IP:10.84.22.21
我们在语句中又加了一个括号,目的就是要再确认一个位置,这个位置就是要定做“Bcast”左面,这个括号中的内容就是顺序环视了
一个逆序环视指定边界从表达式的右边开始(我们想要的IP的左边界),
并上一个顺序环视,指定一个结束位置是到表达式的左边(确定了IP的右边界),那么IP的位置就确认了,表达式“.*”就能匹配到这个IP的内容。
总结下,上面说的都是肯定环视,就是匹配到表达式后做的操作,具体的格式如下:
(?<=Expression)
(?<=Expression) |
逆序肯定环视,表示所在位置左侧能够匹配Expression |
顺序肯定环视,表示所在位置右侧能够匹配Expression |
否定环视的格式如下:
逆序否定环视,表示所在位置左侧不能匹配(?!Expression) |
顺序否定环视,表示所在位置右侧不能匹配Expression |
由于否定的逆序的应用场景我还没有遇到,在这里就不举例了,但是原理应该和上述的类似...