正则表达式用于匹配字符,通常需要配合工具一起来使用,比如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*