Linux 正则表达式与通配符区别--案例

本文详细介绍了Linux中通配符和正则表达式的区别,并深入探讨了正则表达式的基础符号功能,包括[]与|的区别、[]、[]+、[]*的匹配差异。通过grep和egrep的使用案例以及perl正则表达式,帮助读者理解正则表达式的实际应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Linux 通配符

* {} [] [^] ?
功能:用来匹配文件名,由shell解析的,比如find,ls,cp,mv等命令可以使用通配符查找文件

例子:
find /etc -type f -name "*.conf"    #查以.conf结尾的文件
echo {0..100}                       #打印1-100
echo {a..z}                         #打印a-z
cp time.txt{,.bak}                  #文件备份
echo {1..10..2}                     #打印1-10个数,每个间隔2个数打印一次
echo {a..z..3}                      #打印a-z个数,每个间隔3个数打印一次

二、Linux 正则表达式

^ $ . * .* ^$ [] [^] + | () {} ?
功能:用来匹配字符串,针对文件内容的文本过滤,比如vim,grep,awk,sed等工具使用正则表达式

使用正则注意事项:
1、所有符号皆为英文符号
2、使用三剑客的时候加上双引号
3、注意肉眼无法观察的字符 (如空格,tab键,windows换行符 )
4、测试正则时推荐使用grep/egrep

基础正则表达式符号功能:

1)^ 以什么开头的行,如^#
egrep '^my' oldboy.txt

2)$ 以什么结尾的行,如com$
egrep 'com$' oldboy.txt

3)^$ 空行
egrep -v '^$' oldboy.txt

4). 任意一个字符
egrep 'ol.boy' oldboy.txt

5)* 前一个字符连续出现0次或0次以上
egrep '0*' oldboy.txt

6).* 所有,任何字符
egrep '^m.*m $' oldboy.txt

7)[] 一次匹配一个字符,[abc]匹配或a或b或c的字符,
[0-9] #匹配数字
#匹配字母(大小写字母)
[a-z]
[A-Z]
[a-zA-Z]
[a-Z]
egrep '[0-9]' oldboy.txt

8)[^] 相当于[]取反,[abc]不匹配或a或b或c的字符
 egrep '[^0-9]' oldboy.txt
 
#扩展正则:
9)|  或者
egrep 'oldboy|my' oldboy.txt

10)+  前一个字符连续出现1次或1次以上
egrep '[0-9]+' oldboy.txt

11){} 设置一个范围,连续出现次数
a{n,m} 前一个字符a连续出现至少n次,最多m次
a{n} 前一个字符a连续出现n次
a{n,} 前一个字符a连续出现至少n次
a{,m} 前一个字符a连续出现最多m次
egrep '0{1,5}' oldboy.txt
egrep '0{4}' oldboy.txt
egrep '[0-9]{17}[0-9X]' id.txt  #身份证号匹配

12) ()
1.代表整体
egrep 'oldb(o|e)y' oldboy.txt

2. sed后向引用(反向引用)
[root@laoyang 20210701]#  echo {1..10}|sed -r 's#([0-9]+)#<\1>#g'
<1> <2> <3> <4> <5> <6> <7> <8> <9> <10>

13)? 前一个字符连续出现0次或1次
==============================================
[root@laoyang 20210701]# cat job.txt
joooooooob
jooooob
jooob
job
jb
==============================================

[root@laoyang 20210701]# egrep 'jo?b' job.txt
job
jb


正则表达式符号: [] 与 | 区别

[] 可以表示或者,单个字符匹配,使用方法[yoldg]
|  可以表示或者,多个字符或单个字符匹配,使用方法 oldboy|lidao


正则表达式符号:[]、[]+、[]*正则匹配的区别

在oldboy文件里匹配0-9中任意出现的单个字符,若匹配成功则输出该字符
[root@laoyang 20210701]# egrep '[0-9]' oldboy.txt -o
5
1
6
7
7
7
在oldboy文件里连续匹配0-9中任意出现1次或1次以上的单个字符,若匹配成功则输出该连续字符
[root@laoyang 20210701]# egrep '[0-9]+' oldboy.txt -o
51
6
7
7707681
49000448
4900000448

在oldboy文件里连续匹配0-9中任意出现0次或0次以上的单个字符的行,若匹配到则输出行(没有出现0-9的字符行也输出)
[root@laoyang 20210701]# egrep '[0-9]*' oldboy.txt.bak
my qq is 7707681
my qq is 49000448
my god ,i am not oldbey,but OLDBOY!
123456 78

grep/egrep使用正则案例:

排除文件中的空行,只包含空格的行
=========================================
[root@laoyang 20210701]# cat star.txt
oldboy

lidao    
     

lidao
   lidao  
=========================================
4种方法:
egrep -v '^$|^[ ]+$' star.txt
egrep -v '^$|^ +$' star.txt
egrep -v '^$|^ *$' star.txt
egrep [a-z] star.txt


匹配出/etc/passwd的第1列
grep '^[a-zA-Z0-9_-]*' /etc/passwd
grep '^[^:]*' /etc/passwd

特殊转义字符

\t tab键
\n 回车
\b 退格键
[root@laoyang 20210701]# echo -e 'oldboy\nlidao \baf'
oldboy
lidaoaf

grep perl正则表达式(grep -P)

(?=要匹配的内容) lookahead 零宽度正预测先行断言
(?<=要匹配的内容) lookbehind 零宽度正回顾后发断言

案例:

#1、获取网页中某个字符串,找到<title>的位置再向后匹配.*,找到</title>的位置再向前匹配.*
curl -s www.baidu.com |grep -Po '(?<=<title>).*(?=</title>)'

#2、取服务器运行了多长时间
[root@laoyang 20210701]# cat time.txt
16:30:13 up 41 days, 17:41,  1 user,  load average: 0.03, 0.09, 0.08
16:29:51 up  7:20,  2 users,  load average: 0.01, 0.03, 0.05

[root@laoyang 20210701]# cat time.txt |grep -Po '(?<=up).*(?=,[ ]+[0-9]+ user)'
 41 days, 17:41
  7:20
 
#3、取服务器IP
[root@laoyang 20210701]# ip a s eth0 |grep 'inet '
    inet 172.17.0.14/20 brd 172.17.15.255 scope global eth0

[root@laoyang 20210701]# ip a s eth0 |grep 'inet '|grep -Po '[0-9.]+(?=/20)'
172.17.0.14

perl各符号代表意思:

\d [0-9]
\D [^0-9]
\s 空字符 空格 tab 连续的空格 连续tab,相关于 [\ \t\r\n\f]
\w [0-9a-zA-Z_]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值