文章转载自
https://www.cnblogs.com/junhuiwang/p/11656735.html
正则表达式
1- 定义
1.1 正则表达式的基本格式
regular expression
作用
通过对文件中的内容进行过滤筛选,然后对文件的内容进行处理
经常用基于正则写脚本来处理日志文件
构成
一堆特殊符号和字母构成–元字符
1.2 正则表达式的种类
基本正则表达式
扩展正则表达式
2- 正则表达式的使用
通常会结合三个命令使用
2.1 grep
作用: 对文件中的内容进行逐行过滤
格式: grep [选项] 匹配内容 文件
选项:
1)无选项参数
从文件a.txt中过滤出包含root的行
grep root a.txt
2)-v:取反
文件a.txt中过滤出不包含root的行
grep -v root a.txt
3)-o:仅仅显示出所匹配到的内容
从文件a.txt中找出全部的root(只显示root)
grep -o root a.txt
4)--color:将匹配到的内容着色
5)-E:使用扩展正则表达式
6)-i: 忽略大小写
7)例子
从文件a.txt中统计root的个数
grep -o root a.txt | wc -l
2.2 sed
2.3 awk
3- 正则中的元字符
匹配单个字符
3.1 .(点) 表示任意一个字符
(可以是空格,逗号, 字母, 数字…)
3.2 [ ] 表示范围内的一个字符
3.2.1 用字母和数字的方式表示
[12345] 表示1 或2 或3 或4 或5
[1234567890] 表示 任意一个数字
[abc] 表示a 或b 或c
[a-z] 表示任意一个小写字母
[A-Z] 表示任意一个大写字母
[A-Z] 表示任意一个大写字母
[a-zA-Z] 表示任意字母
[0-9a-zA-Z] 表示所有数字和字母的任一个
例子:过滤出包含数字的行
grep [0-9] a.txt
3.2.2 用字符集的方式表示
[:space:] 表示一个空格
[:digit:] 表示0-9全部十个数字 //等价于 0123456789, 而不等价于[0123456789]
[[:digit:]] 表示任意一个数字
[:lower:] 表示全部26个小写字母
[:lower:] 等价于 abcdef....z
[[:lower:]] 表示任意一个小写字母
[[:upper:]] 表示任意一个大写字母
[[:alpha:]] 表示任意一个字母
[[:punct:]] 表示任意一个标点符号
[[:alnum:]] 表示任意一个数字和字母
补充
[[:digit:][:lower:]] //表示任意一个数字或小写字母 即 [0123456789abcdefg.......z]
[[:space:][:digit:][:upper:]] //匹配空格或者数字或大写字母
3.3 [^] 匹配范围以外的单个字符
例子:匹配没有数字1或者3 或7的行
[^137]
例子:过滤出没有数字的行
[^[:digit:]]
例子:过滤出没有数字和大写字母的行
[^[:digit:][:upper:]]
3.4 显示匹配到的行的前后若干行
-A n 显示匹配行后的N行
-B n 显示匹配行前的N行
-C n 显示匹配行前后的各N行
例子:从a.txt中过滤出包含数字2的行,同时显示该行下的3行内容
# grep -A3 "2" a.txt
3.5 次数匹配
* 表示其前面的字符出现任意次数的情况(0,1,n)
.* 表示任意长度的任意字符
? 表示其前面的字符出现最多一次的情况
\{m,n\} 表示其前面的字符出现最少m次,最多n次的情况
\{3,\} 其前面的字符出现表最少3次
\{,5\} 其前面的字符出现表最多5次
例子:
a* 表示任意多个a(可以是0 ,1, n)
ab* 表示a后面的b出现任意多次
例子:过滤出包含字母a和b的行,要求a在前,b在后
# grep "a.*b" fileName
例子:
"a\{2,5\}b"
3.6 位置锚定
^ 表示以什么为开头的行
$ 表示以什么为结尾的行
\< 表示单词首部
\> 表示单词尾部
^$ 表示空白行
例子:
过滤出包含root的行
# grep "root" a.txt
过滤出以root为开头的行
# grep "^root" a.txt
过滤出以root为结尾的行
# grep "root$" a.txt
过滤出以空格为开头的行
# grep "^[[:space:]]" a.txt
过滤出以多个空格后面是root为开头的
# grep "^[[:space:]]\{1,\}root" a.txt
3.7 分组
\( \) 将一个内容当做一个整体看待
\1 表示引用前面的第一个分组
\2 表示引用前面的第二个分组
例子: 从文件a.txt中,过滤出出现过两个相同数字的行
# grep "\([[:digit:]]\).*\1" c.txt
4- 扩展正则表达式
4.1 基本正则
grep [选项] 匹配内容 文件
4.2 扩展正则
方式1:grep -E 匹配内容 文件
方式2:egrep 匹配内容 文件
主要多了两个元字符:
1.次数匹配
+:其前面的字符出现至少一次的情况效果等同于:{1,}
例子:匹配a前有至少一个b的行
[root@localhost tmp]# egrep "b+a" a.txt
或者
[root@localhost tmp]# grep -E "b+a" a.txt
2.或
|
例子:从文件a.txt中过滤出cat 和Cat
# grep -E "(c|C)at" a.txt
或者
# grep -E "cat|Cat" a.txt
补充:
在基本正则表达式中,? {} () 需要在前面使用 \ 进行转义
在扩展正则表达式中是不需要的