为什么find + sed搜索和替换方式比grep -r慢

时间:2018-01-18 22:06:28

标签: bash performance unix sed grep

我正在尝试在存储库(大约200mB,3000个文件)上进行搜索和替换,并且我发现与相同表达式的grep相比,它确实很慢。即使很难匹配的数量相当低(偶数100),所以替换部分不应该减慢很多。

使用的命令:

time grep -r 'home' .

real    0m0.228s
user    0m0.154s
sys     0m0.071s


time find . -type f -exec sed -i 's/home/test/g' {} \;

real    0m38.064s
user    0m8.893s
sys     0m28.552s


time find . -type f -exec sed -i 's/home/test/g' {} +

real    0m25.671s
user    0m5.654s
sys     0m19.968s


time find . -type f

real    0m0.090s
user    0m0.013s
sys     0m0.028s

这里发生了什么?无论如何都要用不同的命令来加速它?

1 个答案:

答案 0 :(得分:1)

慢速部分可能sed重写每个文件 - 它必须为每个文件执行此操作,即使是不匹配的文件也是如此。如果大多数文件不匹配,您应该能够通过使用grep生成匹配文件列表(您知道这很快)来加快速度,然后将其提供给{{1}重写它们。

sed

grep -r -l 'home' . | while read -r filename; do sed -i 's/home/test/g' "$filename" done 的{​​{1}}选项告诉它只打印匹配的文件名。

如果你正在使用GNU -l,你可以使用grep选项来终止文件名,从而使这更安全,更高效。然后包含换行符的文件名不会成为问题。

grep