linux 第六章 shell编程及自动化运维–三剑客
一、正则表达式
1、前言
名词解释:
正则表达式是一种字符模式,用于在查找过程中匹配指定的字符。在大多数程序里,正则表达式都被置于2个正斜杠之间:例如/I[oO]ve/就是正斜杠界定的正则表达式,它将匹配被查找的行中任何位置出现的相同模式。在正则表达式中,元字符是最重要的概念。
正则能被哪些工具用到: vim、sed、awk、grep
适用场景: mysql、oracle、PHP、python、Apache、Nginx…需要正则
2、元字符
定义: 原字符是这样一类字符。他们代表的是不同于字面本身的含义。
分类:
基本正则表达式元字符:
^:行首定位符
搜索以root开头的。
[root@localhost] grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost] grep ^root /etc/passwd
root:x:0:0:root:/root:/bin/bash
$:行尾定位符。
给我搜一下Love结尾的,作为行的末端的文字
[root@localhost] grep love 1.txt
i love you
love you
love
[root@localhost] grep love$ 1.txt
love
. :匹配任意单个字符。
[root@localhost] grep abc 1.txt
abc
[root@localhost] grep adc 1.txt
adc
[root@localhost] grep a.c 1.txt
abc
adc
*:匹配前导符0到多次。
[root@localhost] cat 1.txt
lve
love
loove
loooove
loobbe
lo333ve
[root@localhost] grep lo*ve 1.txt #匹配0到多个o最后以ve结尾
lve
love
loove
loooove
[root@localhost] cat 1.txt
a
ab
abc
abcd
abcde
abcdef
[root@localhost] grep abc 1.txt
abc
abcd
abcde
abcdef
[root@localhost] grep abc* 1.txt
ab
abc
abcd
abcde
abcdef
.*:任意多个字符
[root@localhost] cat 1.txt
lve
love
loove
loooove
loobbe
lo333ve
[root@localhost] grep lo3.* 1.txt
lo333ve
[root@localhost] grep lo.*be 1.txt
loobbe
[ ]:匹配指定范围内的一个字符
[root@localhost] cat 1.txt
love
Love
1ove
iove
[root@localhost] grep [lL]ove 1.txt
love
Love
[-]:匹配指定范围内的一个字符,连续的范围
[root@localhost] cat 1.txt
love
Love
1ove
iove
[root@localhost] grep [0-9] 1.txt
1ove
[root@localhost] grep [a-z]ove 1.txt
love
iove
[^]:匹配不在指定组内的字符
[root@localhost] cat 1.txt
love
Love
1ove
iove
[root@localhost] grep [^a-z] 1.txt
Love
1ove
[root@localhost] grep [^0-9]ove 1.txt
love
Love
iove
\:用来转义元字符(’ ’ ” “ \)
[root@localhost] cat 1.txt
love
Love
1ove
iove
.ove
[root@localhost] grep "\." 1.txt
.ove
[root@localhost] grep "\.ove" 1.txt
.ove
[root@localhost] ./configure \
> --with-user=www \
>
\ <:词首定位符
[root@localhost] cat 1.txt
i love you
a love b
iloveyou
[root@localhost] grep "\<love" 1.txt
i love you
a love b
[root@localhost] cat 1.txt
i loveyou
loveyou
[root@localhost] grep "\<love" 1.txt
i loveyou
loveyou
[root@localhost] grep "^love" 1.txt
loveyou
\ >:词尾定位符
[root@localhost] cat 1.txt
i youlove
you love
[root@localhost] grep "love\>" 1.txt
i youlove
you love
():\ (…\ )
vim 1.txt
: 3,9 s/\(.*\)/a\1/ #、\1代表调用前方的括号,每一行前面多个a,但是()会被误解所以加转义符\,做种意思就是3到9行加个a
vim 1.txt
: 3,9 s/\(a\)\(.*\)/\2\1/ #、把a放到每行的句尾
: 3,9 s/\(.*\)\(#\)/\1/ #、句尾的a去掉
x\ {m\ }:字符x重复出现m次
[root@localhost] cat 1.txt
love
loove
looove
[root@localhost] grep "o\{3\}" 1.txt
looove
x\ {m,\ }:字符x重复出现m次以上
[root@localhost] cat 1.txt
love
loove
looove
[root@localhost] grep "o\{1,\}" 1.txt #一次以上
love
loove
looove
x\ {m,n\ }:字符x重复出现m到n次
[root@localhost] cat 1.txt
love
loove
looove
loooove
looooove
loooooove
[root@localhost] grep "o\{3,5\}" 1.txt
looove
loooove
looooove
loooooove
扩展正则表达式元字符:
+:匹配1~n个前导字符
[root@localhost] cat 1.txt
lve
loove
looove
loooove
looooove
loooooove
[root@localhost] egrep lo+ve 1.txt
loove
looove
loooove
looooove
loooooove
[root@localhost] egrep lo*ve 1.txt
lve
loove
looove
loooove
looooove
loooooove
?:匹配0~1个前导字符
[root@localhost] cat 1.txt
lve
love
loove
[root@localhost] egrep lo?ve 1.txt
lve
love
a|b:匹配a或b
[root@localhost] cat 1.txt
qwertyuiopsdfghjklxcvb
qwertyuiopasdfghjkmnbvc
nbvcxygfdqaeeryigygeus
awyiebgbfeygkcba
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dNEo2qRK-1673151923096)(C:\Users\hyb\AppData\Roaming\Typora\typora-user-images\image-20221228132319481.png)]
():组字符
[root@localhost] cat 1.txt
rs
loyeable
lovers
[root@localhost] egrep "love(able|rs)" 1.txt
loveable
lovers
3、示例
^[A-Z]..$ #开头一个大写,最后2个任意字符
^[A-Z][a-z]*3[0-5] #一个大写开头,0到多个小写或空格,包含3,最后是0到5的一个数字
[a-z]*\. #0到多个小写字母,最后一个点
^ *[A-Z][a-z][a-z]$ # 0到多个空格开头,一个大写,一个小写,再一个小写结尾
^[A-Za-z]*[^,][A-Za-z]*$ #0到多个字母开头,文中无逗号,0到多个英文结尾
\