Linux正则表达式
正则表达式:Regual Expression, REGEXP
由一类特殊字符及文本字符所编写的模式,其中有些字符不表示其字面意义,而是用于表示控制或通配的功能;
分两类:
基本正则表达式:BRE
扩展正则表达式:ERE
正则表达式的意义
- 处理大量的字符串
- 处理文本
通过特殊符号的辅助,可以让linux管理员快速过滤、替换、处理所需要的字符串、文本,让工作高效。
通常Linux运维工作,都是面临大量带有字符串的内容,如
- 配置文件
- 程序代码
- 命令输出结果
- 日志文件
且此类字符串内容,我们常会有特定的需要,查找出符合工作需要的特定的字符串,因此正则表达式就出现了
- 正则表达式是一套规则和方法
- 正则工作时以单位进行,一次处理一行
- 正则表达式化繁为简,提高工作效率
- linux仅受三剑客(sed、awk、grep)支持,其他命令无法使用
正则表达式应用非常广泛,应用在如Python、Java、Perl等,Linux下普通命令无法使用正则表达式的,只能使用三剑客。
通配符是大部分普通命令都支持的,用于查找文件或目录,而正则表达式是通过三剑客命令在文件(数据流)中过滤内容的
Linux三剑客
文本处理工具,均支持正则表达式引擎
- grep:文本过滤工具,(模式:pattern)工具
- sed:stream editor,流编辑器;文本编辑工具
- awk:Linux的文本报告生成器(格式化文本),Linux上是gawk
正则表达式的分类
Linux三剑客主要分两类
- 基本正则表达式(BRE、basic regular expression)
BRE对应元字符有 ^$.[]*
- 扩展正则表达式(ERE、extended regular expression)
ERE在在BRE基础上,增加上 (){}?+| 等字符
基本正则表达式BRE集合
- 匹配字符
- 匹配次数
- 位置锚定
符号 | 作用 |
---|---|
^ | 尖角号,用于模式的最左侧,如 "^oldboy",匹配以oldboy单词开头的行 |
$ | 美元符,用于模式的最右侧,如"oldboy$",表示以oldboy单词结尾的行 |
^$ | 组合符,表示空行 |
. | 匹配任意一个且只有一个字符,不能匹配空行 |
转义字符,让特殊含义的字符,现出原形,还原本意,例如. 代表小数点 |
|
* | 匹配前一个字符(连续出现)0次或1次以上 ,重复0次代表空,即匹配所有内容 |
.* | 组合符,匹配任意长度的任意字符 |
^.* | 组合符,匹配任意多个字符开头的内容 |
.*$ | 组合符,匹配以任意多个字符结尾的内容 |
[abc] | 匹配[]集合内的任意一个字符,a或b或c,可以写[a-c] |
[^abc] |
匹配除了^后面的任意字符,a或b或c,^表示对[abc]的取反 |
<pattern> |
匹配完整的内容 |
<或> | 定位单词的左侧,和右侧,如<chao> 可以找出"The chao ge",缺找不出"yuchao" |
扩展正则表达式ERE集合
扩展正则必须用 grep -E 才能生效
字符 | 作用 |
---|---|
+ | 匹配前一个字符1次或多次,前面字符至少出现1次 |
[:/]+ | 匹配括号内的":"或者"/"字符1次或多次 |
? | 匹配前一个字符0次或1次,前面字符可有可无 |
竖线 | 表示或者,同时过滤多个字符串 |
() | 分组过滤,被括起来的内容表示一个整体 |
a{n,m} | 匹配前一个字符最少n次,最多m次 |
a{n,} | 匹配前一个字符最少n次 |
a{n} | 匹配前一个字符正好n次 |
a{,m} | 匹配前一个字符最多m次 |
Tip:
grep命令需要使用参数 -E即可支持正则表达式
egrep不推荐使用,使用grep -E替代
grep不加参数,得在特殊字符前面加""反斜杠,识别为正则
grep
全拼:Global search REgular expression and Print out the line.
作用:文本搜索工具,根据用户指定的“模式(过滤条件)”对目标文本逐行进行匹配检查,打印匹配到的行
模式:由正则表达式的元字符
及文本字符
所编写出的过滤条件
;
语法:
grep [options] [pattern] file
命令 参数 匹配模式 文件数据
-i:ignorecase,忽略字符的大小写;
-o:仅显示匹配到的字符串本身;
-v, --invert-match:显示不能被模式匹配到的行;
-E:支持使用扩展的正则表达式元字符;
-q, --quiet, --silent:静默模式,即不输出任何信息;
grep命令是Linux系统中最重要的命令之一,功能是从文本文件
或管道数据流
中筛选匹配的行
和数据
,如果再配合正则表达式
,功能十分强大,是Linux运维人员必备的命令
grep命令里的匹配模式
就是你想要找的东西,可以是普通的文字符号
,也可以是正则表达式
参数选项 | 解释说明 |
---|---|
-v | 排除匹配结果 |
-n | 显示匹配行与行号 |
-i | 不区分大小写 |
-c | 只统计匹配的行数 |
-E | 使用egrep命令 |
--color=auto | 为grep过滤结果添加颜色 |
-w | 只匹配过滤的单词 |
-o | 只输出匹配的内容 |
案例
cat /etc/passwd > /tmp/test_grep.txt
grep "login" /tmp/test_grep.txt -n #找出login有关行
grep "login" /tmp/test_grep.txt -n -v #找出没有login的行
grep "ROOT" /tmp/test_grep.txt -i #忽略大小写,找出root有关行
grep -E "root|sync" /tmp/test_grep.txt --color=auto #同时过滤出root和sync有关行
grep "login" /tmp/test_grep.txt -c #统计匹配结果的行数
grep "login" /tmp/test_grep.txt -n -o #只输出匹配出的内容
grep "oldboy" /tmp/test_grep.txt -w #完整匹配,字符串精确匹配,整个单词
grep -Ev "^#|^$" /tmp/test_grep.txt #过滤掉空白和注释行
正则表达式grep实践
准备测试文件
^符号
1.输出所有以m开头的行
[root@pylinux data]# grep -i -n "^m" luffy.txt # -i忽略大小写 -n 显示仪行号
5:My qq is 877348180.
7:My name is chaoge.
2.输出所有以i开头的行
[root@pylinux data]# grep -i -n "^i" luffy.txt
1:I am oldboy teacher
2:I teach linux.
3:I like python.
$符
1.输出所有以r结尾的行
[root@pylinux data]# grep -i -n "r$" luffy.txt
1:I am oldboy teacher
2.输出所以以m结尾的行
[root@pylinux data]# grep -i -n "m$" luffy.txt
9:Our school website is http://oldboyedu.com
TIP
注意在Linux平台下,所有文件的结尾都有一个$符
可以用cat -A 查看文件
3.输出所有以"."结尾的行,注意用转义符
1.注意不加转义符的结果,正则里"."是匹配任意1个字符,grep把.当做正则处理了,因此把有数据的行找出来了,
[root@pylinux data]# grep -i -n ".$" luffy.txt
1:I am oldboy teacher
2:I teach linux.
3:I like python.
5:My qq is 877348180.
7:My name is chaoge.
9:Our school website is http://oldboyedu.com
2.加上转义符,当做普通的小数点过滤
[root@pylinux data]# grep -i -n ".$" luffy.txt
2:I teach linux.
3:I like python.
5:My qq is 877348180.
7:My name is chaoge.
^$组合符
1.找出文件的空行,以及行号
[root@pylinux data]# grep "^$" luffy.txt -n
4:
6:
8:
10:
11:
12:
.点符号
"."点表示任意一个字符,有且只有一个,不包含空行
[root@pylinux data]# grep -i -n "." luffy.txt
1:I am oldboy teacher
2:I teach linux.
3:I like python.
5:My qq is 877348180.
7:My name is chaoge.
9:Our school website is http://oldboyedu.com
匹配出 ".ac",找出任意一个三位字符,包含ac
[root@pylinux data]# grep -i -n ".ac" luffy.txt
1:I am oldboy teacher
2:I teach linux.
转义符
1.找出文中所有的点"."
[root@pylinux data]# grep "." luffy.txt
I teach linux.
I like python.
My qq is 877348180.
My name is chaoge.
Our school website is http://oldboyedu.com
*符
1.找出前一个字符0次或多次,找出文中出现"i"的0次或多次
[root@pylinux data]# grep -n "i*" luffy.txt
1:I am oldboy teacher
2:I teach linux.
3:I like python.
4:
5:My qq is 877348180.
6:
7:My name is chaoge.
8:
9:Our school website is http://oldboyedu.com
10:
11:
12:
.*组合符
.表示任意一个字符,*表示匹配前一个字符0次或多次,因此放一起,代表匹配所有内容,以及空格
[root@pylinux data]# grep '.*' luffy.txt
I am oldboy teacher
I teach linux.
I like python.
My qq is 877348180.
My name is chaoge.
Our school website is http://oldboyedu.com
^.*o符
^以某字符为开头
.任意0或多个字符
.*代表匹配所有内容
o普通字符,一直到字母o结束
这种匹配相同字符到最后一个字符的特点,称之为贪婪匹配
[root@chaogelinux data]# grep "I.*o" luffy.txt
I am oldboy teacher
I like python.
[abc]中括号
中括号表达式,[abc]表示匹配中括号中任意一个字符,a或b或c,常见形式如下
- [a-z]匹配所有小写单个字母
- [A-Z]匹配所有单个大写字母
- [a-zA-Z]匹配所有的单个大小写字母
- [0-9]匹配所有单个数字
- [a-zA-Z0-9]匹配所有数字和字母
[root@pylinux data]# grep '[a-z]' luffy.txt
I am oldboy teacher
I teach linux.
I like python.
My qq is 877348180.
My name is chaoge.
Our school website is http://oldboyedu.com
[root@pylinux data]# grep '[abcd]' luffy.txt
I am oldboy teacher
I teach linux.
My name is chaoge.
Our school website is http://oldboyedu.com