Допустим, у меня есть 5 сообщений в / var / mail /, и я хочу прочитать одно сообщение за раз, а затем выполнить поиск строки в этом письме, прежде чем перейти к следующему сообщению. Есть ли команда, которую я могу использовать для разбора одного сообщения за раз?
Я ищу написать bash-скрипт, который будет читать все сообщения в файле mbox, а затем читать их по одному, чтобы я мог затем извлечь Subject, To, From & Status сообщения (код возврата). Мой план состоял в том, чтобы использовать grepmail для подсчета количества писем в файле, а затем использовать это число в цикле for, чтобы получать по одной почте за раз, и они выполняли операции над текстом. Что-то вроде:
$count = grepmail -r . /var/mail/user | awk '{print $2}'
for($i=1;$i<=$count;$i++) {
$content = *GetMessage* -number $i /var/mail/user
...
Do string operation on this message & save to $DelimitedData
...
}
$Delimiteddata
Я не могу понять, как получить одно сообщение за раз, чтобы выполнить над ним строковую операцию. Может кто-нибудь подсказать мне, какая команда / программа может помочь мне сделать это не в интерактивном режиме.
formail
Ответ @Gilles хорош, но также стоит знать, что маркер «начала сообщения» в файле формата mbox - это строка, начинающаяся сFrom
(«From» и пробел). Это может быть надежно использовано для разделения файлов mbox на отдельные сообщения с регулярным выражением,^From
поскольку гарантированно НЕ находится в заголовках или теле сообщения (любые строки тела, которые начинаются с «От», изменяются при сохранении в mbox , обычно "> From" или аналогичный). См en.wikipedia.org/wiki/MboxОтветы:
formail
Инструмент из Procmail (доступен в любом дистрибутиве, это классический) предназначен именно для этой цели.Основное использование:
работает
myprogram --option
по каждой почте по очереди. Программа получает каждое письмо на свой стандартный ввод.источник
formail
может забрать N-е сообщение в существующий файл спула, хотя может ли это?formail
есть+skip
опция и-total
опция («пропустить» в+skip
это количество пропущенных сообщений, а "total" in-total
- это общее количество выводимых сообщений - поэтому+5 -1
будет выводиться только 6-е сообщение).formail
читает со стандартного ввода, например,formail </var/mail/bob -s test.sh
formail -s </var/mail/user ./test.sh
. И в файле test.sh я читаю сообщение, используяmessage=$(</dev/stdin)