为什么在读取数据时;做回声" $ data" | cut -d:-f1;做得那么慢?

时间:2017-04-26 15:24:25

标签: bash performance pipe

要仅获取git grep打印的文件,我可以

$ git grep "search" | cut -d':' -f1

所以我制作了一个简短的帮助脚本cutg,我可以将其传递到~/bin/ dir。

#!/bin/sh
while read data; do
    echo "$data" | cut -d':' -f1
done

所以现在我可以做到

$ git grep "search" | cutg

但它很慢。

为什么这样?如何使它像第一个命令一样快?

2 个答案:

答案 0 :(得分:2)

脚本应该只是:

cut -d':' -f1

或(更好)

exec cut -d':' -f1

Shell循环很慢 - 特别是如果它们在每次迭代时调用一个进程,特别是如果它们无用的话。

答案 1 :(得分:1)

您的循环读取每行输入,为每行创建一个新的cut进程。原始单行使用单个cut进程进行所有输入。值得庆幸的是,您可以继承脚本的标准输入,只需编写

即可
#!/bin/sh
exec cut -d: -f1 "$@" -

除了使用适当的cut调用替换自己之外,您的脚本根本不需要执行任何操作。我已添加"$@",以防您想为cut提供其他参数,但如果您确定不需要,我们可以放心地将其保留。