tail 和 grep 递归吗?

tail 和 grep 递归吗?

尝试tail通过域名列表搜索黑客代码。我查找的所有文件都相同,因此我尝试了以下方法:

grep -rnl * -e "Ai9LbaFz7lC13SwzDxAYT72vwA"

尝试查看文件名/目录。

但是,这会搜索整个文件,这会浪费 CPU 和时间,因此尝试使用它,tail因为我只需要搜索文件的一小部分。这有效:

tail -n10 * | grep --line-buffered -e '^==> .* <==$' -e 'Ai9LbaFz7lC13SwzDxAYT72vwA'

但是它tail似乎不是递归的,所以它只会停留在它的目录中。我绝对不是代码大师,所以我希望有人能给我指明正确的方向。

谢谢。

答案1

tail 命令必须读取整个文件才能计算出最后十行。它通过查找换行符来确定行。因此,它读取文件以查找固定字符串。

另一方面,您的 grep 正在读取整个文件以查找固定字符串。听起来几乎是一回事。诚然,grep 稍微复杂一些,但我敢打赌,分叉新进程和设置管道的开销比 grep 的开销要大。但是,您可以通过告诉 grep 您的模式是固定字符串而不是正则表达式来稍微加快 grep 的速度。为此,请为 grep 指定“-F”选项(或使用 fgrep)。如果您有 GNU grep,您可能还可以使用 --mmap 来加快速度。

尝试grep -rnl * --mmap -F -e "Ai9LbaFz7lC13SwzDxAYT72vwA"一下,看看它是否和你的尾巴解决方案一样快甚至更快。:)

不过,仅使用 grep 进行扫描的准确性是另一个问题,因为这仍然无法验证匹配是否在文件的最后 10 行中。但我希望通过建议使用后处理命令来计算匹配文件中的行数或其他内容来掩盖这一部分。;)

答案2

重击:

shopt -s globstar nullglob

for f in **; do
    if [[ -f $f ]] && tail -n 10 "$f" | grep -q --options 'pattern'; then
        echo "$f"
    fi
done

相关内容