一.基本正则表达式
1.字符含义
字符 | 含义 |
---|---|
^ | 行首定位符 |
$ | 行尾定位符 |
. | 匹配任意单个字符 |
* | 匹配前导符0到多次 |
.* | 任意多个字符 |
[] | 匹配指定范围内的字一个字符 |
[-] | 匹配指定范围内的一个字符,连续的范围 |
[^] | 匹配不在指定组内的字符 |
\ | 用来转义元字符,脱义符 |
() | 匹配稍后使用的字符的标签 |
x\ {m\ } | 字符x重复出现m次 |
x\ { m,\ } | 字符出现m次以上 |
x\ {m,n\ } | 字符出现m到n次 |
2.练习
1.^行首定位符
[root@DBSEC_DAS ~]# grep "root" /etc/passwd #包含root的行
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@DBSEC_DAS ~]# grep "^root" /etc/passwd #以root开头的行
root:x:0:0:root:/root:/bin/bash
2.$行尾定位符
[root@DBSEC_DAS ~]# cat test
abc
hello
dbsec
[root@DBSEC_DAS ~]# grep "c$" test #查找以c为结尾的行
abc
dbsec
3. .匹配任意单字符
[root@DBSEC_DAS ~]# grep "abc" test
abc
[root@DBSEC_DAS ~]# grep "a.c" test #任意单字符
abc
acc
agc
4.匹配前导符0到多次
[root@DBSEC_DAS ~]# grep "abc*" test #c可以是0个,可以是多个
ab
abc
abcd
abcde
[root@DBSEC_DAS ~]# grep "abcd*" test #d可以是0个,可以是多个
abc
abcd
abcde
5. .* 任意多个字符
[root@DBSEC_DAS ~]# grep ".*" test #全部满足要求
ab
abc
abcd
abcde
6.匹配指定范围内的一个字符
[root@DBSEC_DAS ~]# cat test
love
Love
iove
1ove
[root@DBSEC_DAS ~]# grep "[1l]ove" test #1ove和love满足要求
love
1ove
7.[-]匹配指定范围内的一个字符,连续的范围
[root@DBSEC_DAS ~]# cat test
love
Love
iove
1ove
[root@DBSEC_DAS ~]# grep "[0-9]" test #匹配到1ove
1ove
[root@DBSEC_DAS ~]# grep "[a-z]ove" test #匹配到love和iove
love
iove
[root@DBSEC_DAS ~]# grep "[A-Z]ove" test #匹配到Love
Love
8.[^]匹配不在指定组内的字符
[root@DBSEC_DAS ~]# cat test
love
Love
iove
1ove
[root@DBSEC_DAS ~]# grep "[^0-9]ove" test #除了1ove全显示
love
Love
iove
[root@DBSEC_DAS ~]# grep "[^0-9a-z]ove" test #除了iove、love、1ove全显示
Love
[root@DBSEC_DAS ~]# grep "[^0-9 A-Z]ove" test #除了1ove、Love全显示
love
iove
9.\ 转义符
[root@DBSEC_DAS ~]# cat test
love
l.ve
[root@DBSEC_DAS ~]# grep "l." test #匹配所有
love
l.ve
[root@DBSEC_DAS ~]# grep "l\." test #只匹配l.
l.ve
10.()匹配稍后使用的标签
#love
#you i love
~
~
......
~
~
:1,2 s/\(.*\)/#\1/ #在两行内容的前面加上#符号 /A/B\1/ \1替代前面的A
11.x\{m\}字符重复出现m次
[root@DBSEC_DAS ~]# cat test
love
loove
looove
[root@DBSEC_DAS ~]# grep "o\{3\}" test #匹配o出现三次
looove
12.x\{m,\}字符重复出现m次以上
[root@DBSEC_DAS ~]# cat test
love
loove
looove
[root@DBSEC_DAS ~]# grep "o\{2,\}" test #字符出现两次以上
loove
looove
13.x\{m,n\}字符出现m到n次
[root@DBSEC_DAS ~]# cat test
love
loove
looove
loooove
looooove
[root@DBSEC_DAS ~]# grep "o\{3,5\}" test #匹配o出现3-5次
looove
loooove
looooove
二.扩展正则表达式(egrep或grep -E)
1.字符含义
字符 | 含义 |
---|---|
+ | 匹配1~n个前导符 |
? | 匹配0~1个前导符 |
a|b | 匹配a或b |
() | 组字符 |
2.练习
1.+匹配1~n个前导符
[root@DBSEC_DAS ~]# cat test
love
loove
looove
loooove
[root@DBSEC_DAS ~]# egrep "lo+ve" test #匹配1-n个o
love
loove
looove
loooove
2.?匹配0-1个前导符
[root@DBSEC_DAS ~]# cat test
love
loove
looove
loooove
[root@DBSEC_DAS ~]# egrep "lo?ve" test #匹配0-1个前导符
love
3.a|b 匹配a或b
[root@DBSEC_DAS ~]# cat test
love
loove
looove
loooove
test
[root@DBSEC_DAS ~]# egrep "o|t" test #匹配所有带o和t的行
love
loove
looove
loooove
test
4.()组字符
[root@DBSEC_DAS ~]# cat test
Lovers
loves
lovers
[root@DBSEC_DAS ~]# egrep "love(s|rs)" test #匹配love带s和带rs的行
loves
lovers
三.示例
1.练习
字符 | 含义 |
---|---|
grep love | 找love |
/^love/ | 以love开头 |
/love$/ | 以love结尾 |
/l.ve/ | l开始,一个任意字符,ve结束 |
/lo*ve/ | l开始,零个或多个o,ve结束 |
/[Ll]ove/ | 大L或者小l开头的ove |
/love[a-z]/ | love最后一个字母小写 |
/love[^a-zA-Z0-9]/ | love最后一个(不是字母或者数字)而是符号 |
/.*/ | 所有行 |
/^$/ | 空行 |
/^ [A-Z]…$/ | 开头一个大写,最后两个任意字符 |
/^ [A-Z][a-z]*3[0-5]/ | 一个大写字母,0到多个小写字母或空格,3,最后一个是0-5的一个数字 |
/[a-z]*\ ./ | 0到多个小写字母,最后一个点 |
/^ *[A-Z][a-z][a-z]$/ | 0到多个空格开头,一个大写,一个小写,在一个小写结尾 |
/^ [A-Za-z][^,][A-Za-z]$/ | 0到多个字母开头,非逗号。0到多个英文结尾 |
/<fourth>/ | 找单词 |
/5{2}2{3}./ | 5两次2三次和一个点 |
/^#/ | #开头的行 |
:1,$ s/([Oo]ccur)ence/\1rence/ | 多了一个r |
:1,$ s/(square) and (fair)/\2 and \1/ | 从第一行到最后一行两个单词互换位置 |