-
正则表达式就是为处理大量的字符串及文本而定义的一套规则和方法。
-
其工作以行为单位进行,即一次处理一行
-
通过正则表达式可以将复杂的处理任务化繁为简,提高操作Linux的效率
-
仅被三剑客(grep/egrep、sed、awk)命令支持,其他命令无法使用
一、Linux三剑客的正则表达式分为两类,即:
(1)基本正则表达式(BRE)
-
BRE对应的元字符有“^$.[]*”
(2)扩展正则表达式(ERE)
-
ERE在BRE的基础上增加了“(){}?+|”等字符
二、基础正则表达式:
【参数】
字符 | 作用 |
^ | 尖角号,用法为^ql,表示匹配以ql单词开头的行 |
$ | 美元符,用法ql$,表示匹配以ql单词结尾的行 |
^$ | 组合符,表示空行,逻辑解释就是以^结尾的行,或者以$开头的行 |
. | 点号,表示匹配任意一个且只有一个字符(但是不能匹配空行) |
\ | 转义字符,让特殊含义的字符脱掉马甲,现出圆形,如\.只表示小数点 |
* | 匹配前一个字符(连续出现)0次或1次以上 注意,当重复0次的时候,表示啥也没有(空),即匹配所有内容 |
.* | 组合符,匹配所有内容 |
^.* | 组合符,匹配以任意多个字符开头的内容 |
.*$ | 组合符,以任意多个字符结尾的内容 |
[abc] | 匹配[]集合内的任意一个字符a或b或c;[abc]也可写成[a-c] |
[^abc] | 匹配不包括^后的任意字符a或b或c,这里的^表示对[abc]的取反,^不能用!代替 |
1、^ 尖角号,用法为^ql,表示匹配以ql单词开头的行
(1)过滤出I开头的行
(2)过滤出家目录以d开头的行
2、$美元符,用法ql$,表示匹配以ql单词结尾的行
(1)过滤出m结尾的行
(2)过滤出/结尾的行
3、^$ 组合符,表示空行,逻辑解释就是以^结尾的行,或者以$开头的行
4、. 点号,表示匹配任意一个且只有一个字符(但是不能匹配空行)
5、\转义字符,让有特殊含义的字符脱掉马甲,现出圆形,如\.只表示小数点
6、*匹配前一个字符(连续出现)0次或1次以上
(1).* 组合符,匹配所有内容
(2)^.*组合符,匹配以任意多个字符开头的内容
(3).*$组合符,以任意多个字符结尾的内容
7、[abc] 匹配[ ]集合内的任意一个字符a或b或c;[abc]也可写成[a-c]
8、[^abc] 匹配不包含^后的任意字符a或b或c,这里的^表示对[abc]的取反,^不能用!代替
测试题:
1、过滤/etc/passwd中以nologin结尾的行
grep "nologin$" /etc/passwd
2、过滤/etc/passwd中以o开头的行
grep "^o" /etc/passwd
3、过滤/etc/passwd中至少含有1个0字符串的行
grep "00*" /etc/passwd
4、过滤/etc/passwd中的空行
grep "^$" /etc/passwd
5、过滤/etc/目录中(不含子目录)下的所有文件
ls -l /etc/|grep "^-"
6、过滤/etc/services中含有点号的行
grep "\." /etc/services
三、扩展正则表达式
字符
|
作用
|
+
|
匹配前一个字符1次或多次
|
[:/]+
|
匹配括号类的:或/字符1次或多次
|
?
|
匹配前一个字符0次或1次
|
|
|
表示或者,即同时过滤多个字符串
|
()
|
分组过滤被括起来的东西表示一个整体,另外()的内容可以被后面的\n应用,n为数字,表示应用第几个括号的内容
|
\n
|
应用前面()小括号里的内容,例如:(aa)\1,匹配aaaa
|
a{n,m}
|
匹配前一个字符最少n次,最多m次
|
a{n,}
|
匹配前一个字符最少n次
|
a{n}
|
匹配前一个字符正好n次
|
a{,m}
|
匹配前一个字符最多m次
|
练习:
测试题
egrep "root|ql" /etc/passwd
egrep "0+" /etc/passwd
egrep "o?" /etc/passwd
egrep "0{1,3}" /etc/passwd
egrep "[:/]+" /etc/shadow