在第 N 个文件匹配后停止 grep

Mat*_*ock 4 grep

我有很多文件需要搜索一些字符串。我正在使用grep -rl 'pattern' *查找包含该模式的文件。但是,我只对文件计数感兴趣 - 如果字符串出现在 N 个以上的文件中,我希望 grep 在命中第 N 个匹配项后立即停止(因为搜索整个文件层次结构是长时间操作)。如果它返回一些有意义的退出代码会很好,但如果这是不可能的,那么我可以wc毫无问题地将它传递给它。

如何在匹配第 N 个文件后告诉 grep 停止搜索其他文件?

cuo*_*glm 8

您可以将grep结果通过管道传输到head.

请注意,为了确保在第 N 个匹配后停止,您需要使用stdbuf以确保grep不缓冲其输出:

stdbuf -oL grep -rl 'pattern' * | head -n10
Run Code Online (Sandbox Code Playgroud)

一旦head消耗了 10 行,它就会终止并grep接收,SIGPIPE因为它head在消失时仍然向管道输出一些东西。

这假设没有文件名包含换行符。

  • 你想用 `stdbuf -oL`(如果在 GNU 或 FreeBSD 上)运行 `grep`,这样它就不会缓冲它的输出。否则,它只会在写入 2 个完整缓冲区后被杀死,在 GNU/Linux 上为 8k,这是一个非常大的文件列表。 (3认同)