Как мне получить список доменных имен из списка писем в Bash? - PullRequest
0 голосов
/ 04 октября 2019

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

То, что я хочу сделать сейчас, это взять из списка ТО и показать список доменов, которые появляются чаще всего.

shopt -s globstar

PUNISHED=$1
VENOM=$2

echo >> topemails.txt
echo >> emails_top_domains.txt

for files in ./$(VENOM)/**/*; do
    if [ -f "${files}" ] ; then

          < "$files" tr '[[:upper:]]' '[[:lower:]]' \
            | grep -Eiorh '([[:alnum:]_.-]+@[[:alnum:]_.-]+?\.[[:alpha:].]{2,4})' 2> /dev/null \
            | sort -nr \
            | uniq -c > topemails.txt
    fi

done

         < topemails.txt \
        | grep -Eiorh '(@[[:alnum:].-]+?\.[[:alpha:].]{2,4})' 2> /dev/null \
        | tr -d "@"  \
        | uniq -u > emails_top_domains.txt

echo "The top \"${PUNISHED}\" emails are"
head -$PUNISHED topemails.txt

echo "The top domains are"
head -$PUNISHED emails_top_domains.txt

Проблема, с которой я продолжаю сталкиваться, заключается в том, что я получаю домены, которые повторяютсясами в моем списке, что не должно произойти, если я использую uniq -u, верно?

Мой код работает следующим образом, я называю скрипт с N переменными и каталогом.

. / Myscript 10 / home / alabasterTenRing /

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

Однако, вот список имен доменов, которые появляются:

mail.goo.ne.jp
gmail.com
jlt3.sipsolutions.net
freewrt.org
yahoo.com
in.ibm.com
gmail.com
arm.com
arndb.de
gmail.com 

gmail не должен повторяться дважды, не говоря уже о трех. Очевидно, что я сделал что-то не так, где я ошибся?

1 Ответ

2 голосов
/ 04 октября 2019

Вы не сортировали ввод перед тем, как перейти к uniq -u. От man uniq делает:

Фильтровать соседние совпадающие строки ..

Если совпадающие строки не соседние, uniq напечатает их снова.

Для вашего случая вы можете просто использовать sort -u. Но sort | uniq -u также будет работать.

Примечания:

  • вы воссоздаете файл topemails.txt в каждом цикле, потому что вы используете >. Скорее всего, вы хотите добавить к файлу.
  • for files.. if -f выглядит так, как будто его можно просто заменить на find ./$(VENOM) -type f и while read или, может быть, просто find ./(VENOM) -type f | xargs cat | tr '[:upper:]' '[:lower:]' ....
  • . [ ] впереди и после занятий в tr не нужны. Поскольку они указываются как при вводе, так и при замене, tr заменяет [ для [ и ] для ], они интерпретируются как обычные символы, без специальной обработки.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...