使用grep vs awk


17

捕获特定图案,awk并且grep可以使用。为什么我们要使用一个?哪个更快,为什么?

如果我有一个日志文件并且想要获取某种模式,则可以执行以下操作之一

awk '/pattern/' /var/log/messages

要么

grep 'pattern' /var/log/messages

我还没有做过任何基准测试,所以我不知道。有人可以详细说明吗?很高兴知道这两个工具的内部工作原理。


在任何命令(甚至是shell脚本)之前,都应加上time命令来确定运行该命令所花费的时间。例如:time ls -l
芦苇

Answers:


26

grep很可能会更快:

# time awk '/USAGE/' imapd.log.1 | wc -l
73832

real    0m2.756s
user    0m2.740s
sys     0m0.020s

# time grep 'USAGE' imapd.log.1 | wc -l
73832

real    0m0.110s
user    0m0.100s
sys     0m0.030s

awk是一种解释型编程语言,其中grep是一种编译的c代码程序(已针对在文件中查找模式进行了优化)。

(注意-我两个命令都运行了两次,因此缓存不会使结果产生偏差)

有关维基百科上解释语言的更多详细信息。

正如斯蒂芬(Stephane)在评论中正确指出的那样,您的里程可能会因所使用的grep和awk的实现,所使用的操作系统以及正在处理的字符集而异。


2
不说您正在使用什么grep或awk实现以及在什么计算机体系结构上以及使用哪种系统字符集,这些时间几乎没有价值。
斯特凡Chazelas

1
第二个命令还将使用新缓存的版本。我毫不怀疑grep更快,但速度却不如您的数字所示。
exussum

(因此运行awk,grep,awk,grep并发布第二组awk和grep的结果:)和供参考,我住在UTF8语言环境中。
Drav Sloan

1
有趣的是,使用BSD工具(在Mac上),awk(31.74s)比sed(33.34s)略快,而sed比grep(34.21s)略快。Gnu awk在5.24s拥有它们所有,我没有gnu grep或sed进行测试。
凯文(Kevin)

1
grep应该稍微快一点,因为awk在每条输入行中所做的不仅仅是在其中搜索一个正则表达式,例如,如果脚本中引用了一个字段(在这种情况下不是这样),awk将根据字段分隔符值,并填充内置变量。但与您发布的内容几乎没有区别。到目前为止 grep和awk wrt匹配正则表达式之间最重要的区别是grep在整行中搜索匹配的字符串,而awk可以搜索特定字段,从而提供更高的精度和更少的错误匹配。
Ed Morton

14

使用最具体,最具表现力的工具。最适合您的用例的工具可能是最快的。

作为大致指导:

  • 寻找匹配子字符串或正则表达式的行?使用grep。
  • 从一个简单分隔的文件中选择某些列?使用切。
  • 执行基于模式的替换或...其他sed可以合理地做到?使用sed。
  • 是否需要上述3的某种组合,printf格式或通用循环和分支?使用awk。

+1,除了使用perl代替awk。如果您需要比grep / cut / sed更复杂的东西,那么机会就不够了,您需要“成熟”的东西
sds 2013年

@sds为什么不使用python代替
RetroCode

@RetroCode:python比perl更“通用”;等效的单线可能会更长。
2016年

3
@sds不,除非您要执行文本处理以外的其他操作,否则您不需要Perl。awk适用于比grep / cut / sed更为复杂的文本处理工作,并且与perl不同,在所有UNIX安装中,奖励都是标准配置。
Ed Morton

10

仅搜索字符串和速度很重要时,您几乎应该始终使用grep。比它快几个数量级awk仅进行整体搜索要。

的sed,AWK和其他Unix解析工具的功能和性能上的差异

UTILITY    OPERATION TYPE      EXECUTION TIME     CHARACTERS PROCESSED PER SECOND
                               (10 ITERATIONS)
-------    --------------      ---------------    -------------------------------
grep       search only         41 sec.            489.3 million
sed        search & replace    4 min. 4 sec.      82.1 million
awk        search & replace    4 min. 46 sec.     69.8 million
Python     search & replace    4 min. 50 sec.     69.0 million
PHP        search & replace    15 min. 44 sec.    21.2 million

1
感谢您对所有这些程序的很好概述。它确实在黑暗中发光。
holasz

1
〜headtilt〜PHP在那里,但是Perl不是吗?
2013年

@Izkata-前一段时间我看到这张桌子时,我也想过同样的事情。
slm

1
grep只是在搜索并且正在替换的其他实用程序并不公平。
凯文

1
这些完全是伪造的数字。谈论比较苹果和橘子-就像说您只能在5秒钟内在网站A上找到一辆新车,而您却可以在1小时内在网站B上找到一辆车,协商价格,获得贷款并购买该车,因此因此,站点A比站点B更快。您引用的文章在grep,sed和awk之间的相对执行速度的声明中是完全错误的,并且还说awk ... has PCRE matching for regular expressions这完全是不正确的。
Ed Morton

5

尽管我同意理论上grep应该比快awk,但实际上YMMV 应该更快,因为这在很大程度上取决于您使用的实现。

这里在Debian / Linux 7.0 amd64(带有glibc 2.17)上以250万行的240MB文件的UTF-8语言环境比较busybox 1.20.0的grep和awk,GNU grep 2.14,mawk 1.3.3,GNU awk 4.0.1仅ASCII字符。

$ time busybox grep error error | wc -l
331003
busybox grep error error  8.31s user 0.12s system 99% cpu 8.450 total
wc -l  0.07s user 0.11s system 2% cpu 8.448 total
$ time  busybox awk /error/ error | wc -l
331003
busybox awk /error/ error  2.39s user 0.84s system 98% cpu 3.265 total
wc -l  0.12s user 1.23s system 41% cpu 3.264 total
$ time  grep error error | wc -l
331003
grep error error  0.80s user 0.10s system 99% cpu 0.914 total
wc -l  0.00s user 0.11s system 12% cpu 0.913 total
$ time mawk /error/ error | wc -l
330803
mawk /error/ error  0.54s user 0.13s system 91% cpu 0.732 total
wc -l  0.03s user 0.08s system 14% cpu 0.731 total
$ time gawk /error/ error | wc -l
331003
gawk /error/ error  1.37s user 0.12s system 99% cpu 1.494 total
wc -l  0.04s user 0.07s system 7% cpu 1.492 total
$ time 

在C语言环境中,只有GNU grep可以得到显着提升,并且比 mawk

数据集,正则表达式的类型也可能有很大的不同。对于正则表达式,awk应该是比较grep -Eawk的正则表达式扩展RE。

对于此数据集,awk可以比更快grep基于busybox的系统或系统中mawk是默认awk和默认语言环境是UTF-8的(IIRC,它使用的是在Ubuntu的情况下)。


2

简而言之,grep它只做许多其他UNIX工具一样的事情,并且使行与给定的模式匹配就可以了。另一方面,awk是更复杂的工具,因为它是POSIX标准定义的完整编程语言,具有典型特征,例如用于模式扫描和处理的变量,数组,表达式,函数或控制语句。

我认为,这取决于两个工具在模式匹配的情况下如何执行以及您要处理的某些输入的大小。我希望grep通常比awk更有效,因为它只匹配。但是您不能使用grep编写简单的代码来执行更复杂的任务,例如不使用其他工具就可以进一步处理匹配的记录,计算或打印结果。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.