Answers:
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的实现,所使用的操作系统以及正在处理的字符集而异。
使用最具体,最具表现力的工具。最适合您的用例的工具可能是最快的。
作为大致指导:
perl
代替awk
。如果您需要比grep / cut / sed更复杂的东西,那么机会就不够了,您需要“成熟”的东西
仅搜索字符串和速度很重要时,您几乎应该始终使用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
awk ... has PCRE matching for regular expressions
这完全是不正确的。
尽管我同意理论上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 -E
为awk
的正则表达式扩展RE。
对于此数据集,awk
可以比更快grep
基于busybox的系统或系统中mawk
是默认awk
和默认语言环境是UTF-8的(IIRC,它使用的是在Ubuntu的情况下)。
time
命令来确定运行该命令所花费的时间。例如:time ls -l
。