Linux - 如何在文件中搜索单词并打印它们出现的次数?

时间:2012-10-13 19:05:03

标签: linux bash shell

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

我想出了如何查找电子邮件并截断@部分,但我无法弄清楚如何计算每个名称出现的次数。

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

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

2 个答案:

答案 0 :(得分:1)

Grep有一个计数选项。

如果您设置了足够强大的注册表来直接匹配电子邮件,您可以使用一个命令计算所有事件:

E.G。

$ 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

答案 1 :(得分:1)

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

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

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

或者正如杰夫指出你可以做uniq -c file.txt | awk '{print}END{print NR}'