常用正则表达式特殊字符及含义
类别 | 区别 | 支持的命令 |
---|---|---|
通配符 | 方便我们进行查找文件 | Linux下面大部分命令支持 |
正则 | 方便我们进行过滤(在文件中找内容) | Linux三剑客 开发语言Python Go PHP JAVA |
基础正则表达式符号
字符 | 作用 |
---|---|
^ | 以……开头的行 |
$ | 以……什么结尾 |
^$ | 组合符号,表示空行 |
. | 点号,表示匹配任意一个字符(不匹配空行) |
\ | 转义字符,给特殊符号脱掉马甲。 |
* | 匹配前一个字符(连续出现)0次或1次以上 |
.* | 组合符,匹配所有内容 |
^.* | 组合符,匹配以任意多个字符开头得内容 |
.$* | 组合符,匹配以任意多个字符结尾的内容 |
[abc] | 匹配[]集合内任意一个字符a或b或c;[abc]也可以也可以写成[a-c] |
[^abc] | 匹配不包含后的任意字符a或b或c,这里的表示对[abc]取反 |
环境准备
[root@oldboy /oldboy]# cat >>oldboy.txt<<EOF
>I am oldboy teacher!
>I teach linux.
>I like badminton ball ,billiard ball and chinese chess!
>my blog is http://oldboy.blog.51cto.com
>our size is http://blog.oldboyedu.com
>my qq is 49000448
>
>not 4900000448.
>my god ,i am not oldbey,but OLDBOY!
>EOF
^号的例子:
在这个文件中找出以ssh开头的行
[root@oldboy /oldboy]# grep '^I' oldboy.txt
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
$号的例子
在文件中找出以m结尾的行
[root@oldboy /oldboy]# grep 'm $' oldboy.txt
my blog is http://oldboy.blog.51cto.com
our size is http://blog.oldboyedu.com
这里m后面是故意加了空格的,所以m后面需要加一个空格
^$的例子
在文件中找出空行
[root@oldboy /oldboy]# grep -n '^$' oldboy.txt
3:
8:
.(点)号的例子
在文件中筛选任意字符
[root@oldboy /oldboy]# grep -n '.' oldboy.txt
1:I am oldboy teacher!
2:I teach linux.
4:I like badminton ball ,billiard ball and chinese chess!
5:my blog is http://oldboy.blog.51cto.com
6:our size is http://blog.oldboyedu.com
7:my qq is 49000448
9:not 4900000448.
10:my god ,i am not oldbey,but OLDBOY!
.(点)的执行过程
[root@oldboy /oldboy]# grep -o '.' oldboy.txt
I
a
m
o
l
d
b
o
y
……
省略若干
转义字符的例子
因为.在正则表达式里有特殊含义,所以需要用转义字符帮他脱掉马甲
转义字符系列
tr的应用
将文件里的回车换成空格
[root@oldboy /oldboy]# tr '[\n]' '[\t]' <oldboy.txt
I am oldboy teacher! I teach linux. I like badminton ball ,billiard ball and chinese chess! my blog is http://oldboy.blog.51cto.com our size is http://blog.oldboyedu.com my qq is 49000448 not 4900000448. my god ,i am not oldbey,but OLDBOY!
echo的应用
在字符串里插入空格和回车
[root@oldboy /oldboy]# echo -e 'oldboy\n\toldboy2'
oldboy
oldboy2
*号的应用
在文件中筛选出现0字符出现的多少次
简单理解他可以匹配出连续出现的字符。连续0次就是不显示,0次以上就会向上面的一样显示出来
.*的例子
通过这个命令我的原意是想找出每一行从开头的任意字符到第一个o。结果他直接帮我找到最后一个o.这里先不要纠结怎么找出来原意需要的东西。通过这个例子是想介绍一下正则表达式的贪婪性。意思是有多少匹配多少。
[]的例子
从文件中筛选出a到z和A到Z之间的字符。
[a-z]===[a-zA-Z]
[a-zA-Z0-9]===[a-Z0-9]==[0-Z]
课堂练习题
显示以m或n或o开头的并且以m或n点结尾的行
[root@oldboy /oldboy]# grep '^[mno].*[mn.]$' oldboy.txt
not 4900000448.
[^]的例子
筛选除了abc之外的字符
这里的反选与grep的自带参数-v的区别是。他自带的是以行为单位,而正则是以字节为单位。
扩展正则
符号 | 作用 |
---|---|
+ | 前一个字符连续出现1次或多次,一般与[]一起使用 |
() | 被括起来的内容相当于一个正体,用来表示向后引用(反向引用) |
{} | b{m,n}前一个字符连续出现至少m次最多n次b{m}前一个字符连续出现m次b{m,}前一个字符连续最多出现n次 |
? | 前一个字符出现0次或1次 |
+号的例子
筛选0出现的多少次
基础正则不支持扩展正则。需要加上grep -E 或者egrep
+与号的区别是,是至少0次,+是至少1次。
|的例子
筛选文件中的oldboy或者linux字符
()的例子
筛选出文件中的oldboy或者oldbey
{}的例子
练习
环境准备
[root@oldboy /oldboy]# cat sfzeng.txt
金 211324198705244720
万 500224197105168312
任 1231231231oldboy
任 3oldboy
任 lidao97303136098
任 alex2197303136098
任 350182197303oldgir
吕 211282199209113038
孔 150000198309176071
邹 371001197412221284
贺 130185200011215926
杜 362522198711278101
向 14052219961008852X
筛选出环境里合格的身份证