我正在尝试将从 cron 作业发送到本地收件箱的每封邮件记录到另一个邮件中TXT文件。当我使用线路时
mail | grep cron > cron_mail.txt
该操作不会停止并创建一个空的cron_mail.txt。
我该如何解决这个问题,或者是否有更简单的方法在 bash 中完成此操作?
答案1
似乎邮件输出到标准错误流,因此它不会通过管道传输到 grep,因为仅通过管道传输标准输出。
尝试mail 2>&1 | grep cron > cron_mail.txt
2 是标准错误流的文件描述符,使用上面的命令,它将被重定向到标准输出,然后通过管道传输。
答案2
如果您的本地邮件后台是 Berkeley 邮箱文件,请尝试
grep '^From cron ' "$MAIL"
这依赖于这样一个事实:Berkeley mbox 文件使用以 开头的行From
(发件人的信封地址)和两个空格(通常后跟消息的到达时间)作为每条新消息之前的分隔行。 (这样做的结果是消息正文不能包含From
行开头任何位置的五个字符。)如果您的cron
守护程序的消息包含例如 FQDN 域名,则显然需要调整正则表达式。
Berkeley mbox 曾经无处不在,但现在,许多系统使用其他邮箱格式,其中许多是基于文件夹的,而不是单个平面文件。对于 maildir(一种特别适用于 IMAP 邮箱的常见格式),请尝试
find new cur tmp -type f -exec grep -m 1 '^From:' /dev/null | grep cron
它检查From:
每封邮件中的标头(这与类似标记的 Berkeley 分隔线不同,后者根本不是邮件标头)。您可以在要检查的文件夹中运行它,或者在目录参数中包含 、 和 子目录new
的cur
完整路径。tmp