为什么这个grep过滤器很慢?

时间:2011-03-22 22:16:53

标签: regex unix command-line grep

我想获得BSD词典单词列表中每个单词的前两个字母,不包括那些只以一个字母开头的单词。

如果没有单字母排除,它运行得非常快:

time cat /usr/share/dict/web2 | cut -c 1-2 | tr '[a-z]' '[A-Z]' | uniq -c > /dev/null

real    0m0.227s
user    0m0.375s
sys 0m0.021s
然而,

点击“..”的过程非常缓慢:

time cat /usr/share/dict/web2 | cut -c 1-2 | grep '..' | tr '[a-z]' '[A-Z]' | uniq -c > /dev/null

real    1m16.319s
user    1m0.694s
sys 0m10.225s

这里发生了什么?

4 个答案:

答案 0 :(得分:9)

问题是UTF-8区域设置,100x加速的简单解决方法


Mac上真正慢的是UTF-8语言环境。

grep ..替换为LC_ALL=C grep ..,然后您的命令运行速度将提高100倍。

对于Linux来说也是如此,除了给定的Linux发行版可能更有可能默认为C环境。

答案 1 :(得分:2)

我不知道为什么会这么糟糕。但我知道加快速度的一种快捷方法是将grep(1)表达式反转为{​​{1}},并丢弃所有单字符行:

-v

答案 2 :(得分:1)

这可能会更好一些,也可以摆脱需要另一根烟斗的切割。

cat /usr/share/dict/web2 | egrep -o '^.{2,}' | tr '[a-z]' '[A-Z]' | uniq -c > /dev/null

答案 3 :(得分:1)

如果你减少使用过多的管道和无用的猫

,它甚至可能会更快
$ awk '{ a[toupper(substr($0,1,2))]++ } END{for(i in a) print i,a[i] }' file