bash script - извлекать только уникальные домены из списка адресов электронной почты в переменную - PullRequest
0 голосов
/ 08 января 2019

Я новичок в bash и у меня проблемы с пониманием, как это сделать.

Отметьте все поля адреса электронной почты в поле «Кому:» и перечислите все уникальные домены в переменной для сравнения с доменом.

Я получаю домен "from address", используя

grep -m 1 "From: " filename | cut -f 2 -d '@' | cut -d ">" -f 1

при чтении почты, хранящейся в файле с именем файла.

Для домена «по адресу» может быть несколько адресов To: и иметь несколько доменов. Я не уверен, как получить уникальные домены из "в поле адреса".

Пример строки адреса будет таким:

To: user@domain.com, user2@domain.com, 
    User Name <sample@domaintest.com>, test@domainname.com
grep -m 1 "^To: " filename | cut -f 2 -d '@' | cut -d ">" -f 1

но есть другой формат электронной почты. Поэтому я не уверен, правильно ли grep или мне нужно искать awk или что-то еще.

Мне нужно получить уникальный список доменов из адреса электронной почты / адресов поля «To:» для переменной в скрипте bash.

Желаемый вывод для приведенного выше примера:

domain.com,domaintest.com,domainname.com

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Если вы хотите сделать это с помощью линейно-ориентированных утилит, в дистрибутиве Procmail есть утилита formail, которая может несколько вас нормализовать.

bash$ formail -czxTo: <<\==test==
> From: me <sender@example.com>
> To: you <first@example.org>,
>    them <other@example.net>
> Subject: quick demo
>
> Very quick, innit.
> ==test==
first@example.org,    other@example.net

Таким образом, у вас есть вход, который вы можете передать grep или Awk ... или sed.

fromdom=$(formail -czxTo: <message | tr ',' '\n' | sed 's/.*@//')

Адрес From: не будет нормализован formail -czxFrom:, но вы можете использовать хитрый прием: заставить formail сгенерировать ответ обратно на адрес From:, а затем извлечь из него заголовок To:.

todoms=$(formail -rtzcxTo: <message | sed 's/.*@//')

Более подробно -r говорит создать новый ответ тому, кто вас послал message, а затем мы делаем -zcxTo: на , что.

(Опция -t может или не может делать то, что вы хотите. В этом случае я бы, возможно, пропустил его. http://www.iki.fi/era/procmail/formail.html имеет (расплывчатую) документацию о том, что он делает; см. Также раздел непосредственно перед этим. http://www.iki.fi/era/procmail/mini-faq.html#group-writable и извините за неуклюжую ссылку - похоже, не существует хорошего внутреннего якоря для ссылки.)

0 голосов
/ 08 января 2019

Нормализация адреса электронной почты сложна, потому что есть так много вариантов на выбор.

From: Elvis Parsley <king@graceland.example.com>
From: king@graceland.example.com
From: "Parsley, Elvis" <king@graceland.example.com> (kill me, I have to use Outlook)
From: "quoted@string" <king@graceland.example.com> (wait, he is already dead)
To: This could fold <recipient@example.net>,
   over multiple lines <another@example.org>

Я бы обратился к более способному языку с надлежащей поддержкой парсинга всех этих форматов. Я выбрал бы Python, хотя вы могли бы также выполнить это в нескольких строках Ruby или Perl.

Библиотека email была обновлена ​​в Python 3.6, поэтому предполагается, что у вас есть хотя бы эта версия. Класс email.Headerregistry, новый в версии 3.6, особенно удобен здесь.

#!/usr/bin/env python3

from email.policy import default
from email import message_from_binary_file
import sys

if len(sys.argv) == 1:
    sys.argv.append('-')

for arg in sys.argv[1:]:
    if arg == '-':
        handle = sys.stdin
    else:
        handle = open(arg, 'rb')

    message = message_from_binary_file(handle, policy=default)
    from_dom = message.get('From').address.domain
    to_doms = set()
    for addr in message.get('To').addresses:
        dom = addr.domain
        if dom == from_dom:
            continue
        to_doms.add(dom)
    print(','.join([from_dom] + list(to_doms)))

    if arg != '-':
        handle.close()

Это просто создает разделенный запятыми список доменных имен; вы можете вместо этого выполнить остальную часть обработки в Python или изменить ее так, чтобы она печатала что-то в несколько ином формате.

Вы бы сохранили это в удобном месте (скажем, /usr/local/bin/fromto) и отметили бы его как исполняемый (chmod 755 /usr/local/bin/fromto). Теперь вы можете вызывать это из оболочки, как и любую другую утилиту, например grep.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...