如何有效地使用grep?

时间:2011-03-04 23:58:18

标签: linux unix search text grep

我有大量要搜索的小文件。我一直在寻找一个好的事实上的多线程版grep,但找不到任何东西。如何提高我对grep的使用?截至目前我正在这样做:

grep -R "string" >> Strings

2 个答案:

答案 0 :(得分:80)

如果您在多核处理器上安装了xargs,只要有人感兴趣,您就可以从以下方面受益。

<强>环境:

Processor: Dual Quad-core 2.4GHz
Memory: 32 GB
Number of files: 584450
Total Size: ~ 35 GB

<强>试验:

<强> 1。找到必要的文件,将它们传递给xargs并告诉它执行8个实例。

time find ./ -name "*.ext" -print0 | xargs -0 -n1 -P8 grep -H "string" >> Strings_find8

real    3m24.358s
user    1m27.654s
sys     9m40.316s

<强> 2。找到必要的文件,将它们传递给xargs并告诉它执行4个实例。

time find ./ -name "*.ext" -print0 | xargs -0 -n1 -P4 grep -H "string" >> Strings

real    16m3.051s
user    0m56.012s
sys     8m42.540s

第3。由@Stephen建议:找到必要的文件并使用+而不是xargs

time find ./ -name "*.ext" -exec grep -H "string" {} \+ >> Strings

real    53m45.438s
user    0m5.829s
sys     0m40.778s

<强> 4。定期递归grep。

grep -R "string" >> Strings

real    235m12.823s
user    38m57.763s
sys     38m8.301s

就我的目的而言,第一个命令工作正常。

答案 1 :(得分:4)

想知道下面使用-n1为什么使用更高的值会更快(比如说-n8?或者将它留下来让xargs做正确的事情)?

xargs -0 -n1 -P8 grep -H "string"

似乎将每个分叉的grep用于处理多个文件会更有效(我假设-n1在argv中只为grep提供一个文件名) - 正如我所看到的,我们应该能够在系统上给出最高n(基于argc/argv最大长度限制)。因此,提出新的grep流程的设置成本不会经常发生。