一、知识梗概
二、正则表达式
定义:正则表达式是一种强大的文本处理工具,用于在文本中搜索符合特定模式的字符串。它由一系列特殊字符和普通字符组成,可以定义复杂的搜索模式。正则表达式被广泛应用于各种编程语言和文本处理工具中。
简单来说就是文本匹配:可以根据你定义的表达式抓取到你想要的东西,实现文本匹配、文本查找以及文本替换等功能的一种工具。
1、通配符
* 匹配0个或者多个字符
? 匹配一个字符
[...] 匹配范围内的任意一个字符
--> [0-9] 0到9任意一个字符
--> [^0-9] 不属于0-9的任意字符
--> [abc] 取a或者b或者c
--> [a-z]取字母a-z之间的字符
{} 组合匹配
举例使用:
#使用{}组合匹配符,中间用逗号隔开,匹配相应数字
[root@localhost 10-17]# mkdir yuhengxing{1,6,99}
[root@localhost 10-17]# ls
yuhengxing1 yuhengxing6 yuhengxing99
#使用{11..15}表示匹配11-15的所有数字
[root@localhost 10-17]# mkdir yuhengxing{11..15}
[root@localhost 10-17]# ls
yuhengxing1 yuhengxing12 yuhengxing14 yuhengxing6
yuhengxing11 yuhengxing13 yuhengxing15 yuhengxing99
2、元字符
有特殊含义的字符,可以表示其他含义如:! $ ^等
后面会举例子用到,和egrep一起使用。
三、egrep
1、grep和egrep的区别
egrep比grep更好用,grep支持基本正则,egrep还支持扩展正则(有:| {} )
比如,egrep可以解析管道符号:
egrep会将“|”理解为“或者”,查找xiaomi或者huawei的文本:
#这里的 “-i”选项表示忽略大小写
#egrep就能理解管道符号,解析为“或者”
[root@localhost 10-17]# egrep -i "xiaomi|huawei" mobile_phone.txt
xiaomi HUAWEI
VIVO huawei
grep就不能理解“|”,而是忽略大小写,查找xiaomi|huawei整体,所以没有找到任何东西:
[root@localhost 10-17]# grep -i "xiaomi|huawei" mobile_phone.txt
[root@localhost 10-17]#
要想使得grep与egrep效果相同,则:
grep -E = egrep
2、egrep的选项
-i 忽略大小写
-o 仅仅展示要查找的内容
-n 显示行号
-v 取反,对整行取反匹配
-i在上面使用过,所以这里举例说明下面三个怎么使用:
#这里的 mobile_phone.txt 文本中,VIVO huawei这个是同一行的内容,所以都显示出来了
[root@localhost 10-17]# egrep -i "xiaomi|huawei" mobile_phone.txt
xiaomi HUAWEI
VIVO huawei
#加上-o选项之后,同一行的VIVO就不在展示出来
[root@localhost 10-17]# egrep -o -i "xiaomi|huawei" mobile_phone.txt
xiaomi
HUAWEI
huawei#获取passwd中含有“root”的内容,-n就显示在哪一行
[root@localhost 10-17]# cat /etc/passwd |egrep "root" -n
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin
#第一行和第十行有root#所有没有root的行都会被输出:
[root@localhost 10-17]# cat /etc/passwd |egrep "root" -v
3、正则表达式和egrep的使用
正则的分类:
基本正则:^ $ . *
扩展正则:| + ? {}
感受一下正则与egrep的使用:
#查找网址正则:
[root@localhost 10-17]# cat web.txt |egrep "[a-Z]+://[0-z]+\.[0-Z]+\.[0-Z]+"
#查找邮箱正则:
[root@localhost 10-17]# cat mail.txt |egrep "[0-Z_]+@[0-Z]+\.[a-Z]+"
#查找ip的正则:
[root@localhost 10-17]# cat /var/log/secure |egrep "(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9])"
扩展正则:
? 0个或者1个前面的字符:
* 0个或者多个前面的字符:
+ 至少一个前面的字符
{n} 至少出现n次前面的字符
{n1,n2} 至少出现n1到n2次前面的字符
^$ 代表空行
. 代表任意单个字符
.* 代表所有字符
* 代表前面的字符出现0个或多个
[root@localhost 10-17]# echo "aaaaabbbbbbccc"|egrep "b*"
aaaaabbbbbbccc
[root@localhost 10-17]# echo "aaaaabbbbbbccc"|egrep ".*"
aaaaabbbbbbccc
如有问题欢迎评论区或后台留言