如何过滤来自特定域的电子邮件?

如何过滤来自特定域的电子邮件?

从一个每行包含一封电子邮件的文件中,我尝试使用以下命令删除电子邮件中的域:

grep -viwE "(gmail.com|hotmail|yahoo|aol|rediffmail.com|msn|outlook|inbox.com|icloud.com|mail.com|zoho.com|yandex|live.)" * > dest.txt

但是,它还会删除包含特定术语的电子邮件,类似于我在括号中给出的内容。
例如电子邮件: [email protected]&[email protected]
该电子邮件[email protected]应该被删除,但其他电子邮件不应该被删除。上述命令删除了这两个实例,这不好。我该如何避免这种情况?

额外的复杂因素是可能会发生编码错误。

答案1

在一个很小的脚本中:

#!/usr/bin/env python3
import sys

# list domains to be removed
rm = [
    'gmail.com', 'hotmail', 'yahoo', 'aol', 'rediffmail.com',
    'msn', 'outlook', 'inbox.com', 'icloud.com', 'mail.com',
    'zoho.com', 'yandex', 'live'
    ]
# read the file per line
for l in open(sys.argv[1]):
    # see if not any of the @domains is in the line
    if not any([d in l for d in ["@"+d for d in rm]]):
        # then print the line
        print(l.strip())

使用

  • 将脚本复制到一个空文件中filter_doms.py
  • 使用输入文件作为参数运行它:

    python3 /path/to/filter_doms.py input_file > output_file 
    

解释

我相信代码和注释已经说明了一切:)


根据评论中的要求,版本忽略解码错误:

#!/usr/bin/env python3
import sys
import codecs

rm = [
    'gmail.com', 'hotmail', 'yahoo', 'aol', 'rediffmail.com',
    'msn', 'outlook', 'inbox.com', 'icloud.com', 'mail.com',
    'zoho.com', 'yandex', 'live'
    ]

with codecs.open(sys.argv[1], "r", encoding="utf-8", errors="ignore") as read:
    for l in read:
        if not any([d in l for d in ["@"+d for d in rm]]):
            print(l.strip())

使用方法完全相同

答案2

您可以使用类似这样的选项grep-f

grep -vhf patternfile file file1

将所有图案patternfile逐行放入

@gmail.com
@hotmail
@yahoo
@aol
@rediffmail.com
..

-h当输入中给出多个文件时,该选项是抑制前缀文件名。

相关内容