此bash脚本现在有一个简单的前提,递归地浏览目录,从该目录中获取每个文件,然后从这些文件中查找与电子邮件地址匹配的模式,获取这些电子邮件地址,对其进行排序,然后计算数量它们出现的次数,然后再次对其进行排序。
接收那些分类的电子邮件,然后使用标题脚本,根据变量PUNISHED打印顶部的电子邮件。
该目录通过第二个参数进行,如果未选择目录,则仅在当前目录中运行。
像这样
./ myscript 20 / usr / home / AlabasterTenRing
这是代码。
submit()
最终发生的是,topemails.txt的打印符合预期,但其中仅显示数字“ 1”。
我可以做些什么?
答案 0 :(得分:1)
我认为有些事情等同于您的脚本,但是这取决于所使用的grep支持。您可以使用grep递归扫描并跳过循环,因为您似乎仍然可以扫描所有文件。
#!/bin/bash
PUNISHED=$1
VENOM=$2
echo "The top ${PUNISHED} emails are"
grep -Eroh "[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}" "./${VENOM}" \
| tr '[:upper:]' '[:lower:]' \
| sort \
| uniq -c \
| sort -nr \
| head -n $PUNISHED
域名现在可以具有超过4个字符的顶级名称,但是我在正则表达式中保留了4个字符。
答案 1 :(得分:1)
这是重现问题的简便方法:
for i in 1 2 3
do
echo "$i" > file
done
您期望file
包含:
1
2
3
它包含:
3
这是因为>
每次都会被截断并覆盖文件,因此您只会从上次迭代中获得结果。
您可以让每个迭代追加,而不是覆盖:
for i in 1 2 3
do
echo "$i" >> file
done
或者只是重定向整个循环,以便将其输出的所有内容收集到文件中:
for i in 1 2 3
do
echo "$i"
done > file