正则表达式

正则表达式

一. 函数

1. 函数的定义:
  • 在编写脚本的过程中,将一串代码保存并取个名字,我们称为函数。这串代码一般是为了实现某个功能。函数的使用过程分为定义函数和调用函数。
  • 将命令序列按格式写在一起
  • 可方便重复使用命令序列
2. 需要注意的地方:
  • 定义函数和调用函数都在脚本内部实现,也就是说函数是在脚本内的。
3. 示例
  • 背景提要
    现在老板让你写一个监控程序,监控服务器的系统状况,当cpu\memory\disk等指标的使用量超过阀值时即发邮件报警,你掏空了所有的知识量,写出了以下代码
while True:
    if cpu利用率 > 90%:
        #发送邮件提醒
        连接邮箱服务器
        发送邮件
        关闭连接
     
    if 硬盘使用空间 > 90%:
        #发送邮件提醒
        连接邮箱服务器
        发送邮件
        关闭连接
     
    if 内存占用 > 80%:
        #发送邮件提醒
        连接邮箱服务器
        发送邮件
        关闭连接
  • 实现了功能,但是重复代码太多了
  • 存在2个问题:
    1. 代码重复过多,一个劲的copy and paste不符合高端程序员的气质
    2. 若日后需要修改发邮件的这段代码,比如加入群发功能,那你就需要在所有用到这段代码的地方都修改一遍
python中的用法:
def 发送邮件(内容)
    #发送邮件提醒
    连接邮箱服务器
    发送邮件
    关闭连接
     
while True:
     
    if cpu利用率 > 90%:
        发送邮件('CPU报警')
     
    if 硬盘使用空间 > 90%:
        发送邮件('硬盘报警')
     
    if 内存占用 > 80%:
        发送邮件('内存报警')
4. 函数的作用
  • 减少重复代码
  • 方便修改、更易扩展
  • 保持代码一致性
5. 函数的使用场景
  • 当写脚本时,有一部分代码在很多地方使用写成函数,然后进行调用
5.1 先测试用代码发送邮件
[root@node1 ~]# systemctl start postfix
[root@node1 ~]# setenforce 0
[root@node1 ~]# systemctl disable --now firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@node1 ~]# vim /etc/selinux/config 
[root@node1 ~]# echo "hello douluo" | mail -s "test" 2807689558@qq.com
[root@node1 ~]# 
  • 在这里插入图片描述
5.2 使用函数发送
[root@node1 ~]# vim test.sh
[root@node1 ~]# cat test.sh 
#!/bin/bash

function sdmail()
{
    echo $1 | mail -s $2 $3
}

sdmail "慕霜" "mushuang" 2807689558@qq.com
sdmail "牧尘" "mushuang" 2807689558@qq.com
[root@node1 ~]# ./test.sh 
[root@node1 ~]# 
  • 在这里插入图片描述
5.3 在外边发送
[root@node1 ~]# vim test.sh 
[root@node1 ~]# cat test.sh 
#!/bin/bash

function sdmail()
{
    echo $1 | mail -s $2 $3
}

sdmail $3 $1 $2
[root@node1 ~]# ./test.sh "test" 2807689558@qq.com "123456"
[root@node1 ~]# 

echo $1 | mail -s $2 $3  
sdmail $3 $1 $2    先看$1($2主题) $2($3收件人) $3($3内容)
  • 在这里插入图片描述

二. 正则表达式

1. 正则表达式分类
  • 正则表达式:REGEXP,REGular EXPression。
  • 正则表达式分为两类:
    • Basic REGEXP(基本正则表达式)
    • Extended REGEXP(扩展正则表达式)
2. 基本正则表达式
//元字符
    .           //任意单个字符
    []          //匹配指定范围内的任意单个字符
    [^]         //匹配指定范围外的任意单个字符
//匹配次数(贪婪模式)
    *           //匹配其前面的任意单个字符任意次
    .*          //任意长度的任意字符
    \?          //匹配其前面的任意单个字符1次或0次
    \+          //匹配其前面的任意单个字符至少1次
    \{m,n\}     //匹配其前面的任意单个字符至少m次,至多n次
//位置锚定
    ^           //锚定行首,此字符后面的任意单个字符必须出现在行首
    $           //锚定行尾,此字符前面的任意单个字符必须出现在行尾
    ^$          //空白行
    \<或\b       //锚定词首,其后面的任意单个字符必须作为单词首部出现
    \>或\b       //锚定词尾,其前面的任意单个字符必须作为单词尾部出现
/分组
    \(\)
    例:\(ab\)*
    //后向引用
        \1      //引用第一个左括号以及与之对应的右括号所包括的所有内容
        \2      //引用第二个左括号以及与之对应的右括号所包括的所有内容
2.1 元字符
.           //任意单个字符
[]          //匹配指定范围内的任意单个字符
[^]         //匹配指定范围外的任意单个字符
[root@node1 ~]# ls
,   100  104  108  12  2  6  A  a                b    c
0   101  105  109  13  3  7  B  abc              bbd  d
1   102  106  11   14  4  8  C  abd              bca  test.sh
10  103  107  110  15  5  9  D  anaconda-ks.cfg  bcd

[root@node1 ~]# ls | grep '...'
100
101
102
103
104
105
106
107
108
109
110
abc
abd
anaconda-ks.cfg
bbd
bca
bcd
test.sh
[root@node1 ~]# 

[root@node1 ~]# ls | grep '[abc]'
a
abc
abd
anaconda-ks.cfg
b
bbd
bca
bcd
c


[root@node1 ~]# ls | grep '[abc][abc][abc]' // aba abb abc baa bab bac caa cab cac aaa bbb ccc

abc
bca
[root@node1 ~]# ls | grep '[abc][abc]'
abc
abd
anaconda-ks.cfg
bbd
bca
bcd
[root@node1 ~]# 

[root@node1 ~]# ls | grep '[0-9][0-9][0-9]'
100
101
102
103
104
105
106
107
108
109
110
[root@node1 ~]# ls | grep '[0-9][0-9]'
10
100
101
102
103
104
105
106
107
108
109
11
110
12
13
14
15
[root@node1 ~]# 

[root@node1 ~]# ls | grep '[^0-9]'
,
A
B
C
D
a
abad
abc
abcd
abd
anaconda-ks.cfg
b
bbd
bca
bcd
c
d
test.sh

取^
[root@node1 ~]# ls | grep '\^'
^
[root@node1 ~]# 
0-9^
[root@node1 ~]# ls | grep '[0-9^]'
0
1
10
100
101
102
103
104
11
12
13
14
15
2
3
4
^
[root@node1 ~]# 

[root@node1 ~]# ls | grep '[-0^9]'
0
10
100
101
102
103
104
\-
^
anaconda-ks.cfg
[root@node1 ~]# 
2.2 匹配次数
//匹配次数(贪婪模式)
    *           //匹配其前面的任意单个字符任意次
    .*          //任意长度的任意字符
    \?          //匹配其前面的任意单个字符1次或0次
    \+          //匹配其前面的任意单个字符至少1次
    \{m,n\}     //匹配其前面的任意单个字符至少m次,至多n次

[root@node1 ~]# ls a*c
aaaaaac  aaaaac  aaaac  aaac  aac  abc  ac
[root@node1 ~]# 


[root@node1 ~]# ls | grep 'a*c'
aaaac
aaac
aac
abc
abcd
ac
anaconda-ks.cfg
bca
bcd
c
[root@node1 ~]# 

[root@node1 ~]# ls | grep '^a*c$'
aaaac
aaac
aac
ac
c
[root@node1 ~]# 

.*  //任意长度的任意字符
[root@node1 ~]# ls | grep '.*'
,
0
1
10
100
101
102
103
104
11
12
13
14
15
2
3
4
A
B
C
D
\-
^
a
aaaaaac
aaaaac
aaaac
aaac
aac
abad
abc
abcd
abd
ac
anaconda-ks.cfg
b
bbd
bca
bcd
c
d
test.sh
[root@node1 ~]# 


\?          //匹配其前面的任意单个字符1次或0次

[root@node1 ~]# ls | grep '^a\?c$'
ac
c
[root@node1 ~]# 


\+          //匹配其前面的任意单个字符至少1次
[root@node1 ~]# ls | grep '^a\+c$'
aaaaaac
aaaaac
aaaac
aaac
aac
ac
[root@node1 ~]# 


\{m,n\}     //匹配其前面的任意单个字符至少m次,至多n次
[root@node1 ~]# ls | grep '^a\{3,5\}c$'
aaaaac
aaaac
aaac
[root@node1 ~]# ls | grep '^a\{2,5\}c$'
aaaaac
aaaac
aaac
aac
[root@node1 ~]# 

[root@node1 ~]# ls | grep '^a\{2,\}c$'
aaaaaac
aaaaac
aaaac
aaac
aac
[root@node1 ~]# 

[root@node1 ~]# ls | grep '^a\{2\}c$'
aac
[root@node1 ~]# ls | grep '^a\{3\}c$'
aaac
[root@node1 ~]# ls | grep '^a\{4\}c$'
aaaac
[root@node1 ~]# 
2.3 位置锚定
//位置锚定
    ^           //锚定行首,此字符后面的任意单个字符必须出现在行首
    $           //锚定行尾,此字符前面的任意单个字符必须出现在行尾
    ^$          //空白行
    \<或\b       //锚定词首,其后面的任意单个字符必须作为单词首部出现
    \>或\b       //锚定词尾,其前面的任意单个字符必须作为单词尾部出现
/分组
    \(\)
    例:\(ab\)*
    //后向引用
        \1      //引用第一个左括号以及与之对应的右括号所包括的所有内容
        \2      //引用第二个左括号以及与之对应的右括号所包括的所有内容


[root@node1 ~]# ls | grep '^a\{3,5\}c$'
aaaaac
aaaac
aaac
[root@node1 ~]# ls | grep '\<a\{3,5\}c\>'
aaaaac
aaaac
aaac
[root@node1 ~]# ls | grep '\ba\{3,5\}c\b'
aaaaac
aaaac
aaac
[root@node1 ~]# 


[root@node1 ~]# cat abc
abc ababc aaac aaaaabac aaaaac aaaaacc
[root@node1 ~]# grep '\<a\+c' abc
abc ababc aaac aaaaabac aaaaac aaaaacc
[root@node1 ~]# 


[root@node1 ~]# ls | grep '^\(ac\)*$'
ac
[root@node1 ~]# touch acacacac
[root@node1 ~]# touch acac
[root@node1 ~]# touch acacacacac
[root@node1 ~]# ls | grep '^\(ac\)*$'
ac
acac
acacacac
acacacacac
[root@node1 ~]# 

[root@node1 ~]# ls | grep '^\(ac\)\{2,3\}$'
acac
[root@node1 ~]# ls | grep '^\(ac\)\{3,4\}$'
acacacac
[root@node1 ~]# ls | grep '^\(ac\)\{1,4\}$'
ac
acac
acacacac
[root@node1 ~]# 



[root@node1 ~]# echo 'hello abc world' |sed 's/hello \(.*\) \(.*\)/hello \2 \1/'
hello world abc
[root@node1 ~]# 
[root@node1 ~]# cat abc
hello run world
[root@node1 ~]# sed 's/hello \(.*\) \(.*\)/hello \2 \1/' abc
hello world run
[root@node1 ~]# sed -r 's/hello (.*) (.*)/hello \2 \1/' abc
hello world run
[root@node1 ~]# sed -E 's/hello (.*) (.*)/hello \2 \1/' abc
hello world run
[root@node1 ~]# sed -ri 's/hello (.*) (.*)/hello \2 \1/' abc
[root@node1 ~]# cat abc
hello world run
[root@node1 ~]# 
3. 扩展正则表达式
//字符匹配
    .       //匹配任意单个字符
    []      //匹配指定范围内的任意单个字符
    [^]     //匹配指定范围外的任意单个字符
//次数匹配
    *       //匹配其前面的任意单个字符任意次
    ?       //匹配其前面的任意单个字符1次或0+       //匹配其前面的任意单个字符至少1次
    {m,n}   //匹配其前面的任意单个字符至少m次,至多n次

//位置锚定
    ^       //锚定行首,此字符后面的任意单个字符必须出现在行首
    $       //锚定行尾,此字符前面的任意单个字符必须出现在行尾
    ^$      //空白行
    \<或\b       //锚定词首,其后面的任意单个字符必须作为单词首部出现
    \>或\b       //锚定词尾,其前面的任意单个字符必须作为单词尾部出现
//分组
    ()      //分组
    \1,\2,\3,....
   例:(ab)*
    //后向引用
        \1      //引用第一个左括号以及与之对应的右括号所包括的所有内容
        \2      //引用第二个左括号以及与之对应的右括号所包括的所有内容
//或者
    |       //or 默认匹配|的整个左侧或者整个右侧的内容
    //例:C|cat表示C或者cat,要想表示Cat或者cat则需要使用分组,如(C|c)at
3.1 示例
//或者
    |       //or 默认匹配|的整个左侧或者整个右侧的内容

[root@node1 ~]# ls | grep -E '^a$|^abc$'
a
abc
[root@node1 ~]# ls | grep '^a$\|^abc$'
a
abc
[root@node1 ~]# 

[root@node1 ~]# ls | grep -E '^(a|A)bc$'
Abc
abc
[root@node1 ~]# ls | grep -E '^a|Abc$'
Abc
a
aaaaaac
aaaaac
aaaac
aaac
aac
abad
abc
abcd
abd
ac
acac
acacacac
acacacacac
anaconda-ks.cfg
[root@node1 ~]# 

三. 其他

1. 示例
1.
[root@node1 ~]# cat abc
80.86 80286 8032286 8086 803386
[root@node1 ~]# grep 80.86 abc
80.86 80286 8032286 8086 803386
[root@node1 ~]# grep '80.86' abc
80.86 80286 8032286 8086 803386
[root@node1 ~]# 


2.
[root@node1 ~]# ls
What      anaconda-ks.cfg  somewhat  what
Whatever  someWhat         test.sh
[root@node1 ~]# ls | grep '[Ww]hat'
What
Whatever
someWhat
somewhat
what
[root@node1 ~]# ls | grep '^[Ww]hat$'
What
what
[root@node1 ~]# 


3.
[root@node1 ~]# ls | grep '[0-9a-b?,;]'
,
0
1
2
3
4
5
6
7
8
9
;
?
a
b
[root@node1 ~]# 


4.
[root@node1 ~]# ls
'!'   1   4   7  ';'  'a!'   b    'b?'  'c?'   f
 ,    2   5   8  '?'   a.   'b!'   c     d     g
 0    3   6   9   a   'a?'   b.   'c!'   e
[root@node1 ~]# ls | grep '[0-9a-b][,;!]'
a!
b!
[root@node1 ~]# ls | grep '[0-9a-b][,.;!]'
a!
a.
b!
b.
[root@node1 ~]# 


5.
[root@node1 ~]# ls
'!'   1    2.   4   7  ';'  'a!'   b    'b?'  'c?'   f
 ,    1.   3    5   8  '?'   a.   'b!'   c     d     g
 0    2    3.   6   9   a   'a?'   b.   'c!'   e
[root@node1 ~]# ls | grep '[0-9a-b][,;!]'
a!
b!
[root@node1 ~]# ls | grep '[0-9a-b][,;.!]'
1.
2.
3.
a!
a.
b!
b.
[root@node1 ~]# 


6.
MM-DD-YY
MM/DD/YY
月 日 年

[0-1][0-9][-/][0-3][0-9][-/][0-9][0-9]
1-12-/   1-31-/ [0-9][0-9]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值