9.Shell中的正则定位符

正则表达式用于匹配字符,通常需要配合工具一起来使用,比如vi、grep、sed、awk,这里重点以grep演示用法

而我们之前提到的通配符一般是用来匹配路径和文件名称的,通常和find、rm、ls、cp一起使用

——————————————————————————————————————————————————————————————————————————————
     
基本正则符号:^..     
    匹配以什么开头的
例如:
grep ^a /root/1.txt
#过滤1.txt中以a开头的行

——————————————————————————————————————————————————————————————————————————————
    
基本正则符号:..$        
    匹配以什么结尾的
例如:
grep 4$ /root/1.txt
    #过滤出以4结尾的行
grep ^$ 1.txt
    #过滤出空行

——————————————————————————————————————————————————————————————————————————————
        
基本正则符号:[..]    
    集合,匹配上[]里任意单个字符,即符合要求
例如:
1.txt里的内容是
a1a2
bb
cc

grep a1[abdfg] /root/1.txt
    #如果哪行里面包含a1且后面紧跟着[abdfg]这几个字符中的任意一个,过滤出来
会显示出:
a1a2

tips:[a-z]这个表示这个集合里的内容是abcd...z  和{1..5}这个造数工具一样的效果,不过这个不能用来做for循环,好像只能在支持正则的工具里用
比如
grep [a-z] 1.txt
grep [A-Z] 1.txt
grep [^a-z] 1.txt
grep [^A-Z] 1.txt

——————————————————————————————————————————————————————————————————————————————
                
基本正则符号:[^..]    
    对集合取反,匹配所有 [^] 里面没有的
例如:
1.txt里的内容是
a1a2
bb
cc
            
grep [^a1] 1.txt
会显示出
a1a2    #2会是重点颜色    
bb
cc
    #按道理来说我只想要bb cc这两行不含a1内容的,但是它把a1a2那行也过滤出来了
    #虽然2是过滤出来的,但是起不到我想要不包含a1行的效果了,所以也体现出正则是匹配字符的,而不是匹配行的,显示出来这些行是因为grep

——————————————————————————————————————————————————————————————————————————————
    
基本正则符号:.        
    匹配任意单个字符
例如:
1.txt里的内容是
a1a2
a
bb
cc
            
grep a. 1.txt
显示出
a1a2
    #如果哪一行有 a和任意一个字符 即过滤
    
——————————————————————————————————————————————————————————————————————————————
            
基本正则符号:*        
    这里的*是正则里的*不是通配符*,通配符*表示匹配任意字符,这里的*是匹配前一个字符任意次数,不能单独使用
例如:
1.txt里的内容是
root
bash
fast
            
grep ro* 1.txt
    显示出
root
    #意思就是找有ro的行,这个r后面的o可以是任意数量,0次也行
还可以和.一起使用,就等于通配符中*的作用了比如
grep ".*" 1.txt
    #.意思就是匹配任意单个字符,*匹配前面的字符任意次数,联用起来就是匹配所有的字符了,也包括空行了
    #之所以用""括起来是因为这俩符合本身具有多重含义,括起来在grep中就代表正则了,建议所有要使用正则的命令都用""括起来
            
——————————————————————————————————————————————————————————————————————————————
            
基本正则符号:\{n,m\}
    匹配前一个字符n到m次 \相当于转译符
例如:
1.txt里的内容是
root
rot
booooooy
fast
            
grep "o\{2,3\}" 1.txt
    显示出
root
booooooy
    #因为rot只有一个o没满足最少2次匹配

——————————————————————————————————————————————————————————————————————————————    
    
基本正则符号:\{n\}
    匹配前一个字符n次
    
——————————————————————————————————————————————————————————————————————————————
    
基本正则符号:\{n,\}
    匹配前一个字符n次及以上
        
——————————————————————————————————————————————————————————————————————————————        
        
扩展正则:
    有些软件是支持这个扩展正则符号的,因为基本正则的符号相对复杂一些,扩展正则是做了一些精简,以及功能上的扩展,基本上也是与grep vi sed awk联用,这四个工具都支持扩展正则
    一些工具即使开启了支持扩展正则,也可以与上面的普通正则符号一起使用
    grep想用扩展正则加上选项 -E,或者直接使用egrep命令
    sed 带选项r 开启扩展正则
    
扩展正则符号:+    
    匹配前面字符1次或者多次,对于shell来说,o oo ooo 每一个单独的o都是满足要求的,所以它会都展示出来,如果没有o则不会显示
例如:
1.txt内容如下:
root
rot
booooooy
        
grep -E "o+" 1.txt
    显示出
root
rot
booooooy
            
——————————————————————————————————————————————————————————————————————————————            
            
扩展正则符号:?
    匹配前面字符0次或者1次,对于shell来说,o oo ooo 每一个单独的o都是满足要求的,所以它会都展示出来,而且就算没有o,它也会匹配,所以会把内容全显示
1.txt内容如下:
root
rot
booooooy

egrep "o?" 1.txt 
    显示出
root
rot
booooooy

——————————————————————————————————————————————————————————————————————————————    

扩展正则符号:{n} {n,m} {n,}
    匹配前一个字符n次
    匹配前一个字符n到m次
    匹配前一个字符n次及以上
    
——————————————————————————————————————————————————————————————————————————————    
        
扩展正则符号:()    
    里面的组合做为一个整体,匹配这个整体,还有一个保留的功能
    比如:
[root@node1 mnt]# head -5 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

egrep '(0:){2}' /etc/passwd        #我要看0:这个整体出现两次的行
    显示出
root:x:0:0:root:/root:/bin/bash
    还有一个功能,代表保留,即
cat 1.txt
ah ah ah
    我要把a和h调个,变成ha,需要用到sed编辑器
sed -r -i '1s/(a)(h)/\2\1/2' 1.txt
    #此时就是改第1行的第2个ah,其中(a)代表的的\1 (h)代表的是\2,这就是保留了原有,单纯的调换顺序
sed -r -i '1s/([a-z])/[\1]/g' 1.txt
    #给所有的小写字母,套上了[]
sed -r -i '1s/^(.)(.*)(.)$/\3\2\1/' 1.txt
    #将第一行的首字符和尾字符调换

——————————————————————————————————————————————————————————————————————————————

扩展正则符号:|
    或者,满足其一的字符匹配
例如:
1.txt内容如下:
aodd
bodd
cc

egrep "ao|dd" 1.txt
    显示出
aodd
bodd

——————————————————————————————————————————————————————————————————————————————

扩展正则符号:\b    
    单词边界,用于过滤单词的
例如:
1.txt内容如下:
bin
 bin
*bin*
binbash
9bin9
abina
    我想过滤出包含bin这个单词的行
egrep "\bbin\b"    1.txt
    显示出
bin
 bin
*bin*
    过滤包含单词"bin"的行,空格 和* & % ^等等这些都是符号,binbash这就不是bin这个单词了,9和a都是字符不是特殊符号,所以shell认为他们不是单词bin
        
只用一个\b,这个时候bin前面不管是不是字符都不重要了,只有后面重要了
例如:
1.txt内容如下:
bin
 bin
*bin*
abin*
        
egrep "bin\b" 1.txt
    显示出
bin
 bin
*bin*
abin*
    
        
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值