echo的扩展功能使字体带颜色\033[32m是修改颜色后面的\033[0m是把字体颜色修改回来
![c0b78f12d88f49ac9805cff38760cd0a.png](https://i-blog.csdnimg.cn/blog_migrate/35a6d679144dcbed02a0ff86964cec54.png)
shell函数:将一些需要重复使用的操作,定义为公共的语句块,使脚本代码更简洁,增强易读性,提高shell脚本的执行效率
写一遍函数名就是调用一遍函数
![b9bb5cdcb0cf427d9e36147048e9431f.png](https://i-blog.csdnimg.cn/blog_migrate/d82b7726dcb5812b9a9728421c9ba3ec.png)
或者使用function定义函数
![15f7a7370e794c6394a82fa6e36404b9.png](https://i-blog.csdnimg.cn/blog_migrate/c913cbd87369ac2fe6c1c025ea6601c3.png)
函数传值
![835d02cb2fa54b498206ee2f49e6ea8e.png](https://i-blog.csdnimg.cn/blog_migrate/fbfda67b2d96c8a6a5379f69e5644ed3.png)
![07d944aeff754225bb8169f7ac7609c0.png](https://i-blog.csdnimg.cn/blog_migrate/6a0a5550a81a51da10da213ba16856cc.png)
编写脚本让查看服务状态显示颜色
![4b8ad9fbb75148f68109db5cda4f18eb.png](https://i-blog.csdnimg.cn/blog_migrate/25d79ef811d3537e7043b5edadbdb0e8.png)
![98080f4836b14db1a6f7e3dc63e8c56c.png](https://i-blog.csdnimg.cn/blog_migrate/639c62986aa719be573e3bddfc92a994.png)
字符串的处理:不改变变量的值,变量需要重复赋值才会改变
1、字符串的截取:${变量名:起始位置:长度},起始位置默认从0开始,
![8937a11979df41739bbcbe0644f41449.png](https://i-blog.csdnimg.cn/blog_migrate/9e6c63fa718cb46a87d9fbb7f9b37f00.png)
$RANDOM随机变量
![808df987e05f4286a897b30f1d237a2c.png](https://i-blog.csdnimg.cn/blog_migrate/5e3a4ddd05cc52bb19ab179c457b39c4.png)
编写随机8位密码脚本
![7d4ffd966c934443a9a8facd49d0a55f.png](https://i-blog.csdnimg.cn/blog_migrate/d209dc7e03b19122bc0b91bee505fda6.png)
![bcf710aa12704dc08c2e51b931c811a3.png](https://i-blog.csdnimg.cn/blog_migrate/65e5380d94d55ed456e5f309c7bc475f.png)
2、字符串的替换:${变量名/旧的/新的},只替换第一个字符,两个//替换所有要替换的字符
![910915bfb2a34f509ccd193f62d1c996.png](https://i-blog.csdnimg.cn/blog_migrate/6121b30a2400fc0470067cb1772b39b2.png)
替换空为删除
![6769741fa9f04da1b78fe6d0bfb9e15e.png](https://i-blog.csdnimg.cn/blog_migrate/5534fa8bfec1f31fe3757ae3ba0b1918.png)
3、字符串的删除(掐头去尾):变量
从左到右${变量名#要删除的内容},也可以使用通配符,两个##表示匹配较长的字符
![9e3455ae9baa4eb08deec3ca436ea8ba.png](https://i-blog.csdnimg.cn/blog_migrate/f93bde6c0ad3a953221e00cf9f160052.png)
从右到左${变量名%要删除的内容},两个%%表示匹配较长的字符
![d65c0f3cfd7947298f9b8694f62c6e7b.png](https://i-blog.csdnimg.cn/blog_migrate/b406f7124b1f9cae4462805ded80e73a.png)
编辑修改文件后缀名脚本
先创建10个文件
![07d05cb219e14ea79bd6f7def74be615.png](https://i-blog.csdnimg.cn/blog_migrate/62cf62040191831958ab893753257b8b.png)
编写脚本
![67ee42d0480446fd8f36a9ad8c757f46.png](https://i-blog.csdnimg.cn/blog_migrate/cd924aa60fd9ab6abc0cd482e5d724a4.png)
![63eb8ae31c874bba91b638686fb1fa6d.png](https://i-blog.csdnimg.cn/blog_migrate/27ce2ccc8d16bbec8c23e6954bb9db75.png)
4、变量的初始值检测及设置:${变量名:-初始值},若变量已经存在并且不为空则返回变量的值,若为空则返回设置的初始值
![c23ef4e73f57467bb50fa09eb0c60b76.png](https://i-blog.csdnimg.cn/blog_migrate/a4c59307758d68d9d8fbf613317f8df2.png)
输入密码时可以设置默认密码
![ddb5284bc4404673a0fee23f0761f219.png](https://i-blog.csdnimg.cn/blog_migrate/96a64520b2fba32eeddd9f01b7753eab.png)
![cacab641e8fa42c4b715db6382af7a29.png](https://i-blog.csdnimg.cn/blog_migrate/11dd11d6b0d30cab058aaf160391419c.png)
正则表达式:使用若干符号配合工具对字符串进行增删改查操作
先把/etc/passwd的前5行传输到一个文件中作为实验文件
![ebc1bc99f5b842d2946f42dd2794aaf0.png](https://i-blog.csdnimg.cn/blog_migrate/ff088330bb1f64d05cf047df86ce6325.png)
^符号匹配以什么为开头的字符串
![43492a8c319e4af88dd9a61349ad1c81.png](https://i-blog.csdnimg.cn/blog_migrate/dac40d96cd525930aeff25474123c5a9.png)
$匹配以什么为结尾的字符串。
![7534d646017549ae9015d4b91fbeec83.png](https://i-blog.csdnimg.cn/blog_migrate/49012716ba64944cc708e52ff99bdaaf.png)
^$表示空行,表示取反-v
![6183b79d6087417b90273bebd254f34b.png](https://i-blog.csdnimg.cn/blog_migrate/63c0247a5bc7117fa1437be8234f9e09.png)
[ ]表示集合,里面的所有字母都查找,不是单个字符串
![8e8aac91e3384861b1700b1078f1c237.png](https://i-blog.csdnimg.cn/blog_migrate/d30010b9bb3dedbdc583266a6a2e3bfc.png)
[a-z]、[A-Z]、[0-9],匹配任意字母和数字
![fcb1c21606a444f4bd7f95fbd365cbf0.png](https://i-blog.csdnimg.cn/blog_migrate/b49c6cd6ca3740ca8fbd41e854a9a68e.png)
[^]对集合取反,显示字母和数字之外的符号
![cb3f8c91180543cbb1fd1d903b75c1d5.png](https://i-blog.csdnimg.cn/blog_migrate/26a2b62c8b3d21b645adf043502c918b.png)
![860a7eca280f4b2a891fb1fc9135cf92.png](https://i-blog.csdnimg.cn/blog_migrate/3eaf97e3cd9ecc412be0f3362fd6ecb1.png)
如果echo $?等于0表示输入的是非数字
‘ . ’匹配当个字符
![ba0568ffa03143738378ad6b8f46f855.png](https://i-blog.csdnimg.cn/blog_migrate/f9a3e93457ccb56f54ee34f0f3d56c5c.png)
‘ * ’匹配前一个字符的任意次数
![f183e62b5ac64d94a26864263378efe9.png](https://i-blog.csdnimg.cn/blog_migrate/05a184d715cc94eadbe95ce1ffa614f0.png)
‘ .* ’表示任意字符
![637e5ce2354248a7a6b03b21c67910fc.png](https://i-blog.csdnimg.cn/blog_migrate/b1704d210ad7943466c342441a7052d0.png)
\{n,m\}匹配前一个字符n到m次
\{n\}匹配前一个字符n次
\{n,\}匹配前一个字符n次及以上
![be1875ca4df74b82961f5c04f442dc15.png](https://i-blog.csdnimg.cn/blog_migrate/48ebcc22894b6cdc1a8cc1dc861374f3.png)
\(\)组合为整体,把0:当为一个整体
![9dbb68dbecde4e83a29be19034b53431.png](https://i-blog.csdnimg.cn/blog_migrate/c6838267e2a255fcfb663b8e5a66dce8.png)
扩展正则规则需要加上-E或者egrep命令
{n,m}匹配前一个字符n到m次
()组合为整体
![b3105062e98b4a10a2862434fa8170c2.png](https://i-blog.csdnimg.cn/blog_migrate/f81db0cf10be0710efed16629a48d2fd.png)
+匹配一个或多个字符,相当于\{1,\}或者{1,}
![dec1b781c3e3403aa201d5b97944328d.png](https://i-blog.csdnimg.cn/blog_migrate/cfba6fa76fb731e3d20f71059b029bac.png)
?最多匹配一次,相当于\{0,1\}
![21ecfc1c3a2042e3880a655ad4e972e8.png](https://i-blog.csdnimg.cn/blog_migrate/1fa581694614e5031117e8ab4eeab176.png)
| 表示或者,匹配多个字符串
![ae39f9a2b56d4a3baae2051a1369eb2f.png](https://i-blog.csdnimg.cn/blog_migrate/308c3a6967a2309f76eb07b963ed26fa.png)
\b 单词边界,在旁边不允许出现数字字母下划线(或使用 \<xxx>\)
![03df86e759ef4c808daaf8c8a4c2b722.png](https://i-blog.csdnimg.cn/blog_migrate/4d9b97926342527cf67b27b71a21becb.png)
![d6e45a3c43c448ab844fe78323594cc5.png](https://i-blog.csdnimg.cn/blog_migrate/58a293e6d829de4290aa720f2295efc9.png)
![fb3b696ee49742dfacbf8e95a0892ec1.png](https://i-blog.csdnimg.cn/blog_migrate/36c0203743236dcf4110bcd7c16b7326.png)
\w匹配数字字母下划线
![385d9bb5e82e498fb98f1839031016ff.png](https://i-blog.csdnimg.cn/blog_migrate/09921c114ad1290ea8db7cd88c8d7211.png)
\s匹配空格和tab键
![258565e4a58a4c40897bf495595d49b6.png](https://i-blog.csdnimg.cn/blog_migrate/3c8c130890fe11ae207f75dfce89de84.png)
\d匹配数字(和[0-9]等效)
![85e8d8d3011941b28041d9461c85254b.png](https://i-blog.csdnimg.cn/blog_migrate/04402659663ad20bf9b8b7fba9c0486b.png)
匹配IP地址0-255拆分成三个部分(250-255、200-249、0-199)
:(25[0-5]\.|2[0-4][0-9]\.|1?[0-9]?[0-9]\.){3}(25[0-5]|2[0-4][0-9]|1?[0-9]?[0-9])
![e122c3f4ad39493b91a9e6c9c0c5bb89.png](https://i-blog.csdnimg.cn/blog_migrate/ad1d6fba428462075e92224e6df66f79.png)
\d替换[0-9]:(25[0-5]\.|2[0-4]\d\.|1?\d?\d\.){3}(25[0-5]|2[0-4]\d|1?\d?\d)
![c6d870e0f5794ff285708b6786b20213.png](https://i-blog.csdnimg.cn/blog_migrate/1d0e69d8cdb969d2d2182a630d335904.png)
sed流式编辑器:可以对文档非交互式增删改查,逐行处理
1.前置指令 | sed 选项 条件 指令
2.sed 选项 条件 指令 被处理文档
选项:-n:屏蔽默认,-r:支持扩展正则,-i:修改源文件
条件:行号 , /字符串/
指令:p:输出,d:删除,s:替换
![13c50847277b43449d8de43b55c26d6d.png](https://i-blog.csdnimg.cn/blog_migrate/82b28ab6b69fe06aa4da33c93242d9b0.png)
使用-n屏蔽默认输出
![0d4ed11f33e74af2a0f7894c3d29a804.png](https://i-blog.csdnimg.cn/blog_migrate/2cabaeff500a1766db638e51958a4b59.png)
查看具体行的字符串
![048d164178a4451e95c2de9894335d21.png](https://i-blog.csdnimg.cn/blog_migrate/5fb66b5e559ab59a5cf871b5d220f8fc.png)
查看连续行
![4be807f0f9fd472789b51f45b6e95389.png](https://i-blog.csdnimg.cn/blog_migrate/1da5593466cb9e684b7bd0f64a7ab80c.png)
![8da74a4dadad4c09bdebd77fd275db37.png](https://i-blog.csdnimg.cn/blog_migrate/4c42d90ec41362480a6f6261e1613dce.png)
查看不连续多行
![7ea02b2e4edc4c629ce13c9d8d5cd4d2.png](https://i-blog.csdnimg.cn/blog_migrate/1fbe501b9f5dcaf955abb5357c441b7e.png)
查看字符串的行
![64dcea7f2da24567ba5aeea4ee201a88.png](https://i-blog.csdnimg.cn/blog_migrate/be1394ca80f73b3b19df791af6966242.png)
![8131b7c6012542d7a0c9f26727029dc2.png](https://i-blog.csdnimg.cn/blog_migrate/990e4ebd4f409b3005536a8a02bde5fe.png)
!取反
![f0c8a0a4d3264b8d9c0e4c502f2595f4.png](https://i-blog.csdnimg.cn/blog_migrate/adfbac79c95efa689d35721f2ef6ecb0.png)
$表示最后一行,‘=’表示输出行号
![56f13adbe814417c9bcf446dc5e6b778.png](https://i-blog.csdnimg.cn/blog_migrate/9ed8348a731cc5fa184a2250e26ed7fb.png)
例如以bin开头的是第几行
![864c204eae7241679b2ac38b6ba3fd6d.png](https://i-blog.csdnimg.cn/blog_migrate/4e1b04915acb09be7809e3d2c737344b.png)
d删除
![66c5dc2f9776460fa0d9db6ca3fe3647.png](https://i-blog.csdnimg.cn/blog_migrate/6f2a0a62edad69c480adbe7cbdbe369f.png)
删除所有空行
![ebe34cf22607473bb2dfb83c23525932.png](https://i-blog.csdnimg.cn/blog_migrate/ae57bf5f04ea0069f27dfea27912956a.png)
s替换 符号 / / /(可替换# # #)
编写实验数据
![9f007678ded247ef9d04abc3de3ca0df.png](https://i-blog.csdnimg.cn/blog_migrate/5cbeb1c2ebbb5a60ccf017b95b5f2980.png)
没有说行号把每个行的第一个匹配的替换
![d28014bf64da40cabea16b8bb6621318.png](https://i-blog.csdnimg.cn/blog_migrate/9760484b34376bcf57657d50a0aff576.png)
匹配第二个数据
![0d0cef5a99b8428c8ad8ce0aba20f7f9.png](https://i-blog.csdnimg.cn/blog_migrate/2b3169de3da1bf52dfebf1a4b4b0ecf5.png)
匹配第三行第三个数据
![b37a99996d924f53a6faa11398461b7b.png](https://i-blog.csdnimg.cn/blog_migrate/ca87f0d6995fcd128d2c8c69e4f14f66.png)
使用字符串匹配行然后再替换要替换是字符串
![435dd961340a452b80ecf1776cffbf22.png](https://i-blog.csdnimg.cn/blog_migrate/c587f74729fd377ca8d41af9b7810817.png)
g表示全换
![fca204132ad941a998e25fe809dd3983.png](https://i-blog.csdnimg.cn/blog_migrate/7e1754d6f087ffce5c540138cc737181.png)
将/bin/bash替换/sbin/sh
![8e68c144303c448ab39b7734dfad6f14.png](https://i-blog.csdnimg.cn/blog_migrate/4a7f9b7c3ca6fa9fadbf4a491bbdc43c.png)
或者修改s后面的三个字符
![773c67565e124bd586e613cb9f876256.png](https://i-blog.csdnimg.cn/blog_migrate/321cd78ac70656dad05875bdc619de9d.png)
加-i修改源文件
![784bd9a8d0924be5b5de08395a67f200.png](https://i-blog.csdnimg.cn/blog_migrate/14d94c02583ae8abeabc076b7136854c.png)
编写脚本:下载配置http服务默认82端口
![150adb0e767b480f897866c8f9e09fe9.png](https://i-blog.csdnimg.cn/blog_migrate/9183122ed7f8e6820bfb80a857783850.png)
执行该脚本
![b5914c55b91b4b9f84ea865735cc8289.png](https://i-blog.csdnimg.cn/blog_migrate/ae2ba9627878882e681e78db48eb1d7d.png)
此时修改成功
![09519a77791c43b4a2f18dc48db464a5.png](https://i-blog.csdnimg.cn/blog_migrate/fae47358b5aac312fd4b7cc428a34bb2.png)
编写脚本:查找所有使用bash的账户,并且以账户名-->密码保存一个文件
![6b6facb82901401da2f8757061dc7d11.png](https://i-blog.csdnimg.cn/blog_migrate/546d3dc84d6685c319beffe7c53317e0.png)
![251e14fdda074ff7b83fd3a56ae65658.png](https://i-blog.csdnimg.cn/blog_migrate/a0a2ae1b2d26b9a5401fb314629a7634.png)
执行脚本
![92c65e4733084351a6cc2d4be468eb42.png](https://i-blog.csdnimg.cn/blog_migrate/16df62b69f31a5f43641c781f436790a.png)
()表示保留,将括号内复制,\数字表粘贴位置
![174e64a07c8c43a9b8dbe172c3857386.png](https://i-blog.csdnimg.cn/blog_migrate/3ef228806dff59913e6a88bbf7726073.png)
a行下追加
![8cdf99262c4d4b0ba16ac9127d08df06.png](https://i-blog.csdnimg.cn/blog_migrate/001d0d8e5c3c4797a171ce8a3fae3ddd.png)
i:行上追加
![28308022fda24e28a7c0ac9f96985bad.png](https://i-blog.csdnimg.cn/blog_migrate/653ac99a9beb37adc2b37045757d74a7.png)
c:整行替换
![7b6c052e91f4430c9c61c083138cd66d.png](https://i-blog.csdnimg.cn/blog_migrate/1b9a6830636c7e04fbc4250e05a6ead5.png)
awk:精确搜索,逐行处理,读取文档时执行 在 ‘{ }’中处理指令
1.前置指令 | awk 选项 条件 指令
2.awk 选项 条件 指令 被处理文档
选项:-F定义分隔符,默认空格分隔符
指令:print 输出
条件:/字符串/,$5~包含,NR/$3== != >= <= ,逻辑组合&& ||
$数字表示第几列,NF表示有几列,NR表示有几行
![9a503fa78754428cbeb8ccb9aae0215b.png](https://i-blog.csdnimg.cn/blog_migrate/c9a3d780cf8606cb5b49b400963facc7.png)
![4c95c9da4ded4e33b425e622d58a8908.png](https://i-blog.csdnimg.cn/blog_migrate/f56534ed9854333c98e017945091a058.png)
![4d23285d547e443487fcefc303c698ee.png](https://i-blog.csdnimg.cn/blog_migrate/80a0ee2c773619273f0c9234ad71364f.png)
![59ff8887e3484cfb88962af4cb63a666.png](https://i-blog.csdnimg.cn/blog_migrate/a576fb4c48deddf4f8f1374fcf399ced.png)
常量放在双引号中
![0adfb29eef244129b84f8b827e3a23c8.png](https://i-blog.csdnimg.cn/blog_migrate/bcaff5c2a4e363b7e355bb4813d14702.png)
输出根目录可用内存
![140816ad1c5d431192c2961260d0f6f4.png](https://i-blog.csdnimg.cn/blog_migrate/4ad229cbec3c09cb1cee05bd117c6ef4.png)
![ba502e13befa4a198d6d88e52624a666.png](https://i-blog.csdnimg.cn/blog_migrate/e9865b4173595acf10b6f2e174c54fd9.png)
查看网卡的数据量
![93a567e244d04eadbd1b07c458d75ad7.png](https://i-blog.csdnimg.cn/blog_migrate/b0018cdc7226c79ab089d0116f1e0c3e.png)
![bba0bca967e2474bb93e3e994d159b34.png](https://i-blog.csdnimg.cn/blog_migrate/907bc8ace75816a00c8dd8475a15d004.png)
在awk中不加双引号为变量
![37cba65ef16547c7a094089d48c8e46f.png](https://i-blog.csdnimg.cn/blog_migrate/95fd21021f943f2b6baf92bcc9e0db40.png)
~包含,第五列不包含root
![34f1e893343d44259c837148037cdb9c.png](https://i-blog.csdnimg.cn/blog_migrate/f654ddbeca96ad8ab4fe3b3bc1d6bc6c.png)
==,<=,>=,!=
输出第二行
![2a1caf648b8146c28cbc563e4db0709c.png](https://i-blog.csdnimg.cn/blog_migrate/bf33d45e32b94e32937e315cc026b34e.png)
第三列大于等于2
![363a47bd63684d568901b0a656375ea5.png](https://i-blog.csdnimg.cn/blog_migrate/dfd2cbd1bb2c251dee2ac5bac655471f.png)
逻辑组合&&、||
![84448c85800c4f2882b0f3d886d97f3d.png](https://i-blog.csdnimg.cn/blog_migrate/19ed50c7eb9b57034cac12919fef1612.png)
这样会输出所有
![1bba363f0287439893a5189b13ad3c46.png](https://i-blog.csdnimg.cn/blog_migrate/39388c9e295a7d65c083ecac01816e8d.png)
==表示精确搜索
![8ace894dee5344b0a6751c63ea4c7c20.png](https://i-blog.csdnimg.cn/blog_migrate/5a05a1ab2634401b2567be0f8fed75d4.png)
而~包含即可
![a3723cc9f40a462cb5490a5ac90c0251.png](https://i-blog.csdnimg.cn/blog_migrate/46f7cbe2b6038370eae98a2fb1b13689.png)
![2189b73c9e674fe895d7b17f05b6afb9.png](https://i-blog.csdnimg.cn/blog_migrate/fd5639278bac9d08171a2f10149ce3fe.png)
awk的处理时机,
执行额外任务
BEGIN任务,执行一次,读取文档前执行
![547637630b334397bd03a49f32212344.png](https://i-blog.csdnimg.cn/blog_migrate/c907020b815154e2ced5b3a0d196e764.png)
逐行任务,执行n次,读取文档时执行
![db8a2884356a4299967cf7bf0f998e7b.png](https://i-blog.csdnimg.cn/blog_migrate/7fbbd82077ca80d2b698244f52c61ee1.png)
END任务,执行一次,读取文档后执行
![718cde79166f48e0a8f697821138d454.png](https://i-blog.csdnimg.cn/blog_migrate/9907a1c9a96694c67f7218b65571551f.png)
![81ec685acc72494ba624169c75899a4b.png](https://i-blog.csdnimg.cn/blog_migrate/cf37cb4a5d9bdaaa29b0a1f51b58ce11.png)
统计用户
![b808278062f54934bf9005ded7cdcc5c.png](https://i-blog.csdnimg.cn/blog_migrate/f1e5641dad6cec921538ef8dc56cd36c.png)
awk数组:相当于可以存储多个值的特殊变量
数组名[下标] = 下标对应的值
![3e34a05e15954593a8a684e7d9f705da.png](https://i-blog.csdnimg.cn/blog_migrate/9d0aea648cd3ead803fa21fc97280f5f.png)
查看文件中相同的个数
![3fe195f16895403094572fe9d8bd9987.png](https://i-blog.csdnimg.cn/blog_migrate/9c1da71dbf3247f20cd0a53805275709.png)
awk的for循环:for(变量名 in 数组名){print 变量名}
统计文件中相同的个数并输出各自的个数
![b4b48c3f32f74a5b989473cb2b5fd8a6.png](https://i-blog.csdnimg.cn/blog_migrate/7af7a0df036bb3965098679cfb0a87e5.png)
统计来访网站的IP地址和访问次数记录(/var/log/httpd/access_log)
![acd9de7cfec2480eb7443e2cb4967461.png](https://i-blog.csdnimg.cn/blog_migrate/fb563a9a170a84a4cd45d212e56614d4.png)
当其他主机访问100次时也会统计到
![a72e52b59b364c2882d82c5034571f4f.png](https://i-blog.csdnimg.cn/blog_migrate/2cda526c19ea02275b1b516fc13c1867.png)
![86a7d507d1754d889e28a97588983cc5.png](https://i-blog.csdnimg.cn/blog_migrate/3d71e7a633eef63e361a8899bf1a8995.png)
把统计结果排序,sort (-n 表示按数字排序,-k表示第几列,-r表降序)默认升序 在n后面加r表降序
![e449acbf26944d108bfcc4d9b211a635.png](https://i-blog.csdnimg.cn/blog_migrate/5ffca4d7fb639046f72c38df54813c40.png)
统计安全日志中登录主机失败的ip地址和次数
![46183b97d62449a4b3cedaae96077ce7.png](https://i-blog.csdnimg.cn/blog_migrate/29246798ccae645202e0cc6ecc8ab0b4.png)
相关的awk应用
![4273757f378742f7aa8a6007bdb6d3c3.png](https://i-blog.csdnimg.cn/blog_migrate/3697123083e28c2c87c0e6c4fb65c1e5.png)
![7bc0c8130f2041a08e3bfda9d743666a.png](https://i-blog.csdnimg.cn/blog_migrate/56380fef8fc7aacc1a90b91ea4d268e9.png)