为什么我的bash脚本不会在创建的文件中列出电子邮件?

时间:2019-10-03 17:04:20

标签: bash

此bash脚本现在有一个简单的前提,递归地浏览目录,从该目录中获取每个文件,然后从这些文件中查找与电子邮件地址匹配的模式,获取这些电子邮件地址,对其进行排序,然后计算数量它们出现的次数,然后再次对其进行排序。

接收那些分类的电子邮件,然后使用标题脚本,根据变量PUNISHED打印顶部的电子邮件。

该目录通过第二个参数进行,如果未选择目录,则仅在当前目录中运行。

像这样

./ myscript 20 / usr / home / AlabasterTenRing

这是代码。

submit()

最终发生的是,topemails.txt的打印符合预期,但其中仅显示数字“ 1”。

我可以做些什么?

2 个答案:

答案 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