上一篇讲了grep基本正则表达式,这一篇将讲述grep扩展的正则表达式的使用。
grep -E 表示支持扩展的正则表达式
grep -E = egrep
一、字符匹配:
扩展模式下的字符匹配与基本正则表达式的字符匹配相同,如:
. 表示任意单个字符
[] 表示范围内人任意单个字符,如[0-9],表示任意单个数字
[^] 表示范围外的任意单个字符,如[^0-9],表示出数字外的任意单个字符
二、次数匹配:
上述字符匹配中,基本正则表达式与扩张表达式完全相同,但次数匹配就有些不一样了。
* 匹配前面字符任意次,与基本正则表达式意义相同
? 匹配其前字符0次或1次,其前面不需要 \ 转义
+ 匹配其前字符至少一次,等于基本正则表达式的 \{1, \} ?+ = *
{m,n} 匹配其前字符至少m次,最多n次,等于基本正则表达式的\{m,n\}
三、位置锚定
与基本正则表达式完全意义,请参考上一篇。
四、分组
基本正则表达式中支持分组,而在扩展正则表达式中,分组的功能更加强大,也可以说才是真正的分组,用法如下:
():分组,后面可以使用\1 \2 \3...引用前面的分组
除了方便后面引用外,分组还非常方便的可以使用上述次数匹配方法进行匹配具有相同条件的数据。
如:grep '^(barlow).*\1' /etc/passwd 搜索/etc/passwd中以barlow开头,而后面还存在barlow的行
[root@localhost ~]# grep --color -E "^(barlow).*\1" /etc/passwd
barlow:x:500:500::/home/barlow:/bin/bash
五、或者
| 表示或,如
a|b 表示匹配a或者b
B|barlow 匹配B或barlow,即 | 匹配的是其整个左边或者右边
(B|b)arlow 匹配Barlow或者barlow,注意与上一行的区别
六、应用实例
示例一:找出/etc/fstab文件中以#开始的行,并标识其所在行号:
[root@localhost ~]# grep --color -n -E "^[#]+" /etc/fstab
2:#
3:# /etc/fstab
4:# Created by anaconda on Sat Jul 13 18:13:39 2013
5:#
6:# Accessible filesystems, by reference, are maintained under '/dev/disk'
7:# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
8:#
示例二:找出除lo以外的其他接口的IPv4地址信息:
[root@localhost ~]# ip add list |egrep "^[[:space:]]+inet[^6].*[^lo]$"
inet 192.168.7.100/24 brd 192.168.7.255 scope global eth0
示例三:找出ifconfig不包含回环地址的其他IP地址,不包括IP广播地址和子网掩码等信息:
[root@localhost ~]# ifconfig |egrep --color "\<([1-9]|[1-9][0-9]|1[0-1]+[0-9]+|12[^7]+|1[3-9]+[0-9]|2[01][0-9]|22[0-3])\>(\.\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>){2}\.\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>"
inet addr:192.168.7.100 Bcast:192.168.7.255 Mask:255.255.255.0