为了捕捉特定的模式,awk
并且grep
可以使用。为什么我们应该使用其中一种而不是另一种?哪个更快,为什么?
如果我有一个日志文件并且我想获取某种模式,我可以执行以下操作之一
awk '/pattern/' /var/log/messages
或者
grep 'pattern' /var/log/messages
我没有做过任何基准测试,所以我不知道。有人可以详细说明一下吗?很高兴了解这两个工具的内部工作原理。
答案1
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。
- 从简单分隔的文件中选择某些列?使用切割。
- 执行基于模式的替换或... sed 可以合理执行的其他操作?使用 sed。
- 需要上述 3 种的某种组合,或 printf 格式,或通用循环和分支?使用 awk。
答案3
当仅搜索字符串并且速度很重要时,您几乎应该始终使用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
答案4
简而言之,grep
与许多其他 UNIX 工具一样,它只做一件事,即将一行与给定的模式相匹配,而且它做得很好。另一方面,awk
它是更复杂的工具,因为它是由 POSIX 标准定义的完整编程语言,具有用于模式扫描和处理的变量、数组、表达式、函数或控制语句等典型功能。
在我看来,这取决于两种工具在模式匹配情况下的执行方式以及您想要处理的某些输入的大小。我希望 grep 通常比 awk 更有效,因为它只进行匹配。但是,您无法使用 grep 编写简单的代码来执行更复杂的任务,例如在不使用其他工具的情况下进一步处理匹配的记录、计算或打印结果。