Я пытаюсь записывать каждое письмо, отправляемое в мой локальный почтовый ящик из задания cron, в другой txt файл. Когда я использую строку
mail | grep cron > cron_mail.txt
, операция не останавливается и создает пустой cron_mail.txt .
Как мне это исправить или есть более простой способ выполнить эту операцию в bash?
Похоже, что почта выводится в стандартный поток ошибок, поэтому она не передается в grep, так как передается только стандартный вывод.
Попробуйте mail 2>&1 | grep cron > cron_mail.txt
2 — это дескриптор файла стандартного потока ошибок, и с помощью приведенной выше команды он будет перенаправлен на стандартный вывод, который, в свою очередь, передается по конвейеру.
Если ваш локальный почтовый ящик представляет собой файл почтового ящика Беркли, попробуйте
grep '^From cron ' "$MAIL"
. Это основано на том факте, что файлы 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:
в каждом сообщении (это отличается от аналогично помеченной разделительной строки Беркли, которая не является заголовком почты в все).Вы должны запустить это в папке, которую хотите изучить, или включить полный путь к подкаталогам new
, cur
и tmp
в аргументах каталога.