如果正文不为空,则从命令行发送邮件

如果正文不为空,则从命令行发送邮件

我想编写一个简单的脚本,当日志发生变化时提醒我。为此,我使用 grep 来查找我感兴趣的行。现在它的工作原理如下:

grep line /var/log/file | mail -s Log [email protected]

问题是,即使没有找到匹配的行,它也会发送邮件。GNU Mailutils 的邮件实用程序似乎没有开关告诉它丢弃带有空正文的邮件。

有没有快速又简单的方法可以做到这一点?

答案1

output=$(grep line /var/log/file); [[ -n "$output" ]] && mail -s Log [email protected]

或者您可以将其变成一个 cron 作业,然后如果它产生任何输出,它将向用户发送电子邮件。您可以编辑 /etc/aliases 文件(然后运行 ​​newaliases 命令)以将邮件发送到不在框上的地址。

例如 cron 条目(虽然你不能设置主题行

1 0 * * *  grep line /var/log/file

或者你可以得到 ifne 实用程序 - 这可能就是你想要的

grep line /var/log/file | ifne mail -s 日志[电子邮件保护]

ifne 命令可从适用于 centos 和 RHEL 的 epel repo 获得。我在网上找不到手册页的链接,但它就在那里

如果 ne(1)
如果 ne(1)

NAME ifne - 如果标准输入不为空则运行命令

摘要 ifne [-n] 命令

描述 ifne 当且仅当标准输入不为空时才运行以下命令。

选项 -n 逆操作。如果标准输入为空,则运行该命令。

          Note  that  if  the  standard  input  is not empty, it is passed
          through ifne in this case.

示例 find . -name core | ifne mail -s "找到核心文件" root

作者版权所有 2008 Javier Merino

   Licensed under the GNU GPL

                              2008-05-01                           ifne(1)

答案2

“man mail”告诉我,如果正文为空,参数-E 将停止发送邮件。对我来说很好用。

-E

如果传出消息的第一部分或唯一部分不包含任何文本,则不发送该消息,而是默默丢弃它,从而在程序启动时有效地设置 skipemptybody 变量。这对于从 cron(8) 启动的脚本发送消息非常有用。

答案3

https://unix.stackexchange.com/a/100720/27458

只需使用伊夫尼

grep line /var/log/file | ifne mail -s Log [email protected]

相关内容