我已经为一个非常大的文件运行了两个命令
grep -E 'string1|string2' 151103*.log|grep 'string3' | grep string4
awk '/string1|string2/ && /string3/ && /string4/' 151103*.log
Run Code Online (Sandbox Code Playgroud)
执行时间几乎相同。但是awk向我展示匹配的结果要快得多。grep也向我展示了相同的结果,但最后,当过程完成时。
两者都花费了相同的时间来完成该过程,只是想知道搜索awk和背后的逻辑grep。
为什么awk更快?两个程序有不同的搜索逻辑吗?如果我在上面的搜索中混淆了字符串,会不会对搜索速度产生影响?
GNUgrep缓冲输出但 GNUawk没有。即使您没有使用 GNU 而是使用awk其他一些变体,如果您打印到终端,它可能仍然是行缓冲的,因此会为每个出现的\newline刷新输出,但是您grep对管道的写入会阻塞-无论如何缓冲。如果您有 GNU,grep您可以将其grep --line-buffered ... | grep ...用于比较以尽快查看结果。可能grep会awk在几乎任何比赛测试中击败- 尤其是 GNU grep.
这是一个sed做你想做的事情:
sed -ne'/string4/{/string3/s/string[12]/&/p;}' <in >out
Run Code Online (Sandbox Code Playgroud)