Сплит большой mbox по отправителю
Я ищу способ разделить очень большой файл mbox на несколько файлов mbox (по одному для каждого отправителя).
В качестве альтернативы, чтобы извлечь сообщения только указанным отправителем.
Глядя вверх и вниз по Интернету, но не нашел (или использовал неправильные условия поиска.
Заранее спасибо.
1 ответ
Если у вас есть Procmail, formail -s procmail -m simple.rc <mbox
разделит сообщения на mbox
в отдельные папки на основе любых правил, которые вы вводите simple.rc
. (Если нет, перейдите к альтернативе Awk.) Например,
:0:
* ^From:(.*\<)?(billg|william henry gates)
billg
:0:
* ^From steve@(pixar|next|apple)\.com
steve
:0:
* ^Subject: I for one welcome our new lizard overlords
lizard
:0:
unmatched
применяет три регулярных выражения по порядку и перенаправляет входящее сообщение в соответствующую папку mbox для первого совпавшего. Окончательная доставка является безусловной и заботится о любых сообщениях, не соответствующих условию.
Единое понятие "отправитель" четко не определено; есть много разных полей, которые вы можете изучить, которые иногда возвращают разные результаты в зависимости от того, как именно было отправлено сообщение. ТривиальноFrom:
заголовок обычно должен содержать имя и адрес отправителя (но некоторые люди используют разные почтовые клиенты, которые по-разному форматируют эту информацию в разных случаях, а иногда и несколько адресов), но есть, по крайней мере, номинальные сценарии, в которых вам следует изучить Sender:
или Resent-From:
или отправитель конверта (называемый From_
в кругах Procmail), а также.
formail -s program args <mbox
просто читает mbox
и разбивает его на отдельные сообщения и запускает program args
для каждого извлеченного сообщения по очереди, передавая сообщение как стандартный ввод.
Если отправитель конверта в разделителе mbox достаточно точен для сортировки сообщений (совет: попробуйте
LC_ALL=C sed -n '/^From /!d;s///;s/ .*//p' mbox |
sort | uniq -c | sort -r -n >senders
и исследуем полученный senders
файл, чтобы увидеть, какие адреса отправителя конверта там есть. ВLC_ALL=C
может быть необязательным, но должен предотвратить использование Unicode sed
от жалобы на ввод, отличный от UTF-8), вы можете использовать простой скрипт Awk для разделения сообщений:
awk '/^From / {
if (NR>1) close output
if ($2 ~ /billg|whgates/) output="billg"
else if ($2 ~ /steve@(pixar|next|apple)/ output="steve"
else if ($2 ~ /lizard-l@lizzserv/) output="lizard"
else output="unmatched"}
{ print >>output }' mbox