一、linux下使用Mail命令发送邮件的配置及快速实现
之前在服务器上增加了一些日志统计shell脚本并且每周进行一次日志分析统计自动在周一早上发到我的邮箱,最近服务器进行了迁移收缩,又得做点重复的事情,首先是让服务器支持邮件发送。
1:yum快速安装mail服务
[dev@B73 ~]$ sudo mail
-bash: mail: command not found
[dev@B73 ~]$ sudo yum install -y mainx
Loaded plugins: fastestmirror, security
Setting up Install Process
....
Complete!
#mail的使用
[dev@B73 ~]$ mail -help
Send options without primary recipient specified.
Usage: mail -eiIUdEFntBDNHRV~ -T FILE -u USER -h hops -r address -s SUBJECT -a FILE -q FILE -f FILE -A ACCOUNT -b USERS -c USERS -S OPTION users
-b<地址>:指定密件副本的收信人地址;
-c<地址>:指定副本的收信人地址;
-f<邮件文件>:读取指定邮件文件中的邮件;
-i:不显示终端发出的信息;
-I:使用互动模式;
-n:程序使用时,不使用mail.rc文件中的设置;
-N:阅读邮件时,不显示邮件的标题;
-s<邮件主题>:指定邮件的主题;
-u<用户帐号>:读取指定用户的邮件;
-v:执行时,显示详细的信息。
2:配置mail文件,在最后添加smtp的账号密码
[dev@B73 ~]$ sudo vim /etc/mail.rc
# For Linux and BSD, this should be set.
set bsdcompat
set from=hello@04007.cn
set smtp=mail.04007.cn
set smtp-auth-user=hello@04007.cn
set smtp-auth-password=password..
set smtp-auth=login
3,mail用法:完成以上两步即可以在mail中发送邮件:
[dev@B73 ~]$ echo "this is a test mail." | mail -s "test_mail" hello@007.cn
mail可以有很多用法,比如可以方便地发送复杂的html内容,同时秒送给多人,发送带附件邮件,使用文件进行邮件发送等等,用法如下:
#shell脚本中使用mail发送复杂的html内容:
echo $charall | mail -s "$(echo -e "标题\nContent-Type: text/html; charset=utf-8")" hello@007.cn
#邮件同时发送给多人的用法
echo $charall | mail -s "$(echo -e "标题\nContent-Type: text/html; charset=utf-8")" -c hello@007.cn test@007.cn
#带附件的用法:
mail -s "this is a test mail" hello@007.cn -a /log/logstat.log
#使用文件进行邮件发送
mail -s "this is a test mail" hello@007.cn < mail.txt
二、sed命令的一些补充:行结合模式匹配取内容及sed命令显示配置文件中的有效内容
之前有一篇文章对linux下的sed命令有一些了解, linux文本分析利器sed命令的使用详细举例[行操作,模式匹配,替换,引用,后向引用]_sed 后向引用-CSDN博客,另有一篇文章:Linux下的sed命令详解、awk模糊匹配统计行数命令详解 以及 tar压缩多个绝对路径文件时如何去掉绝对路径-CSDN博客 对sed命令进行了详细的测试使用,但还是觉得对sed记忆不够深刻,但sed,awk,grep是文本操作的三大利器,有空的时候觉得有必要多进行了一些尝试使用了解。
1,sed结合按行和模式匹配来取内容
在使用sed进行取内容时,除了可以使用按行、模式匹配、模式范围匹配外,sed还支持结合按行和模式匹配来取内容。如下可以使用从第三行开始查找,一直查找到的匹配890的行的内容进行显示。不过注意这里是查找到第一个出现890内容的这一行即停止。
[root@007 shell]# nl s.txt
1 what is you name, yes?aaz123
2 bettertest, dont konw this char
3 jiujiu
4 333,123,or hello 789
5 --hello--
6 1234567890
7 hellowolrd, some times this is good;
8 thisiswhat,haha,shat!
9 toutiao333.
[root@007 shell]# cat -n s.txt | sed -n '3,/890/p'
3 jiujiu
4 333,123,or hello 789
5 --hello--
6
7 1234567890
#如下是修改s.txt内容,以便查看sed模式匹配是查找到第一个匹配的行
[root@007 shell]# cat -n s.txt
1 what is you name, yes?aaz123
2 bettertest, dont konw this char
3 jiujiu
4 333,123,or hello 789
5 --hello--
6
7 1234567890
8 hellowolrd, some times this is good;
9 thisiswhat,haha,shat!
10 toutiao333.
11 yes,the end is 1234567890.
[root@007 shell]# cat -n s.txt | sed -n '3,/890/p'
3 jiujiu
4 333,123,or hello 789
5 --hello--
6
7 1234567890
不过写到这里,突然想那如果我真要实现sed查看到最后一次模式的行内容怎么实现呢?想了一想,办法肯定是有的,不过加了个tac命令,当然除了使用tac外,使用head,tail之类的都可以,好像只使用sed不是很好实现。我这里就使用tac操作一下:
[root@007 shell]# sed -n '3,$p' s.txt | tac | sed -n '/890/,$p' | tac
jiujiu
333,123,or hello 789
--hello--
1234567890
hellowolrd, some times this is good;
thisiswhat,haha,shat!
toutiao333.
yes,the end is 1234567890.
2, 多命令执行的-e选项、分号及多行模式
上面这里列的是在取内容上比之前两篇文章不同的地方,对于sed命令,之前文章也有记录一些比如使用&引用,使用\1后向引用等高级的用法,也有记录常用的显示命令p,行后增加命令a,行前插入命令i,替换本行命令c,以及删除行d,替换命令s,只显示行号命令=,读取和写入文件命令rw等。保存一张图:
看一下这个-e选项, -e可以让sed命令支持多个操作同时进行,比如如下即能显示匹配890的行,同时也能进行内容替换。
[root@007 shell]# sed -n -e '/890/p' -e '/333/s/333/===/gp' s.txt
===,123,or hello 789
1234567890
toutiao===.
yes,the end is 1234567890.
-e选项的功能并不仅仅有此一个办实现,在sed命令里可以使用分号进行多命令执行,也可以使用换行或者使用-f加载文件来执行多命令,比如下面可以使用;分开两个命令,一个是打印行号,一个是打印内容。同时也可以使用分行来实现。如下:
[root@007 shell]# sed -n '/890/=; /890/p' s.txt
7
1234567890
11
yes,the end is 1234567890.
#使用多行模式
[root@007 shell]# sed -n '
> /890/=
> /890/p
> ' s.txt
7
1234567890
11
yes,the end is 1234567890.
再记一个常用的例子,就是在查看配置文件的时候,通常我们只需要显示配置文件中的有效内容,即要删除空行和注释行,当然可以使用grep等其它命令来实现,这里考虑一下使用sed命令来实现显示配置文件中的有效内容:
#当然可以使用管道进行两次内容匹配,不过这里是不能使用-e的。
[root@007 redis-3.2.1]# sed -n '/^#/!p' redis.conf | sed -n '/^$/!p'
#也有更好的办法,想了想试出了下面的这个命令,使用-r来使用扩展正则表达式,这个命令是不是很精简。
[root@007 redis-3.2.1]# sed -n -r '/(^#|^$)/!p' redis.conf
#使用grep也很方便
[root@007 redis-3.2.1]#grep -vE "^$|^#" redis.conf
最后回到上面提到的一个问题,如果只想使用sed查看从某行到最后一次模式匹配的行内容,有没有办法实现?实际也是有的,需要结合sed里的一些内存缓冲区的命令Gh,使用G将一行追加到模式空间(G),追加结束后使用h命令拷贝模板式空间的内容到内存中的缓冲区,最后执行(备注命令执行最后会输出一行空行,原因是保留空间默认为空),命令如下:
[root@007 shell]# sed -n '{4,$G;h;$p}' s.txt | sed -n '/890/,$p' | sed -n '{G;h;$p}'
jiujiu
333,123,or hello 789
--hello--
1234567890
hellowolrd, some times this is good;
thisiswhat,haha,shat!
toutiao333.
yes,the end is 1234567890.