Como posso filtrar e-mails de domínios específicos?

-2

De um arquivo contendo um e-mail por linha, tentei remover os domínios nos e-mails usando este comando:

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

No entanto, ele também remove os e-mails que contêm termos específicos, semelhantes aos que eu forneci nos colchetes.
Digamos, por exemplo, o email: [email protected] & amp; [email protected]
O email [email protected] deve ser excluído, mas os outros emails não devem. O comando acima está excluindo ambas as instâncias que não são boas. Como posso evitar isso?

Uma complicação adicional é que possivelmente ocorrerão erros de codificação.

    
por Jaffer Wilson 10.02.2017 / 15:50

2 respostas

1

Em um script minúsculo:

#!/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())

Para usar

  • Copie o script em um arquivo vazio como filter_doms.py
  • Execute-o com o arquivo de entrada como argumento:

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

Explicação

Eu acredito que o código e os comentários se explica:)

Conforme solicitado em um comentário, uma versão para ignorar erros de decodificação:

#!/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())

O uso é exatamente semelhante

    
por Jacob Vlijm 10.02.2017 / 17:12
0

Você pode usar a opção grep de -f como esta.

grep -vhf patternfile file file1

Coloque todo o seu padrão em patternfile linha por linha como

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

A opção -h é suprimir o nome do arquivo prefixado quando mais de um arquivo é dado na entrada.

    
por Shreyash S Sarnayak 11.02.2017 / 07:34