1

我需要搜索一个目录 ARCHIVE,其中包含许多子目录,每个子目录都包含文件。每个文件中都有一个电子邮件地址。我想列出所有的电子邮件地址,并截断@blah.com,然后列出每个名称的出现次数。

我想出了如何找到电子邮件并截断 @ 部分,但我不知道如何计算每个名字出现的次数。

grep -R '^To: ' $ARCHIVE | cut -d@ -f1 | awk  '{print $2}' | sort | uniq

同样由于某种原因,我无法让它在脚本中工作;每当我调用它时它什么都不做,但是如果我把它放在命令行中它就可以工作。

4

2 回答 2

1

Grep 有一个计数选项。

如果您设备的正则表达式功能强大到可以直接匹配电子邮件,您可以使用一个命令计算所有出现次数:

例如

$ echo -e "1\n\2\n3\n\4" | grep [0-9] -c
4

也就是说,我认为你正在做的最好是使用 sed 和 awk:

sed 's/@.*//' tmp/mails | sort | uniq   | \
while read name ;
do 
   echo $name; 
   awk '$1 ~ /'$name'/ { ++c; } END {print c;}' tmp/mails ;
done

cat tmp/mails:
$ cat tmp/mails 
arne@gmail.com
arnt@treemail.com
jonas@hotmail.com
arne@gmail.com
kari@yahoo.no
alex@wee.moo
arne@gmail.com
jonas@hotmail.com
kari@yahoo.no
jonas@hotmail.com
kari@yahoo.no

$  sed 's/@.*//' tmp/mails | sort | uniq   | while read name ;do echo $name; awk '$1 ~ /'$name'/ { ++c; } END {print c;}' tmp/mails ;done 
alex
1
arne
3
arnt
1
jonas
3
kari
3
于 2012-10-13T19:36:56.747 回答
1

因此,通过我们长时间的评论对话,我会这样做:

grep -R '^To: ' $ARCHIVE | cut -d@ -f1 | awk  '{print $2}' | sort | uniq -c > ind.txt && wc -l ind.txt >> ind.txt

这将获取uniq命令的输出,将其写入文件,然后收集总计并将其附加到同一文件中,以便您在底部查看。

或者正如 Geoff 指出的那样,你可以做到uniq -c file.txt | awk '{print}END{print NR}'

于 2012-10-13T19:48:38.157 回答