Grep与Awk:搜索机制有何不同

时间:2014-07-01 16:55:14

标签: search awk grep

我正在编写一个必须循环的脚本,每个循环不同的脚本从外部文件中提取变量,最后一步编译它们。我试图最大化这个循环可以运行的速度,从而试图找到最适合这项工作的程序。

目前,速率限制步骤是搜索具有2列和450万行的文件。第一列是键,第二列是我提取的值。

我正在评估的两个程序是awk和grep。我已经将两个脚本及其运行时间放在下面找到最后一个值。

time awk -v a=15 'BEGIN{B=10000000}$1==a{print $2;B=NR}NR>B{exit}' infile

T

real    0m2.255s
user    0m2.237s
sys     0m0.018s

time grep "^15 " infile |cut -d " " -f 2

T

real    0m0.164s
user    0m0.127s
sys     0m0.037s

这让我想到了我的问题...... grep是如何搜索的。我理解awk逐行和逐字段运行,这就是为什么它需要更长的时间,因为文件变得更长,我必须进一步搜索它。

grep如何搜索?显然不是一行一行,或者它是否与awk明显不同,考虑到差不多20倍的时差。

(我注意到awk比短文件的grep运行得更快,而且我还没有尝试找到它们发散的地方,但对于那些尺寸,它实际上并不重要!)。

我想了解这一点,以便我可以为将来的程序使用做出正确的决定。

1 个答案:

答案 0 :(得分:1)

你发布的awk命令远远超过grep + cut:

awk -v a=15 'BEGIN{B=10000000}$1==a{print $2;B=NR}NR>B{exit}' infile
grep "^15 " infile |cut -d " " -f 2

所以时间差异是可以理解的。试试这个awk命令,它等同于grep + cut,看看你得到了什么结果,这样我们可以比较苹果和苹果:

awk '/^15 /{print $2}' infile

甚至:

awk '$1==15{print $2}' infile