linux下使用Mail命令发送邮件的配置、快速实现以及sed命令的一些补充:行结合模式匹配取内容及sed命令显示配置文件中的有效内容

一、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等。保存一张图:

8d133974ac87f297bdb8469afc07b32d.png

    看一下这个-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.
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林戈的IT生涯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值