Regex 为什么这个grep过滤器速度慢?

Regex 为什么这个grep过滤器速度慢?,regex,unix,command-line,grep,Regex,Unix,Command Line,Grep,我想得到BSD dict单词列表中每个单词的前两个字母,不包括那些只以一个字母开头的单词 如果没有一个字母排除,它的运行速度非常快: 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 但是,在“。”上进行grepping的速度非常慢: time cat /usr/share

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

如果没有一个字母排除,它的运行速度非常快:

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
但是,在“
”上进行grepping的速度非常慢:

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

这里发生了什么事?

我不知道为什么这么糟糕。但是我知道一个快速加速的方法是用
-v
反转你的
grep(1)
表达式,并扔掉所有一行字符:

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

real    0m0.086s
user    0m0.090s
sys  0m0.000s
问题在于UTF-8语言环境,它可以轻松解决100x加速的问题
Mac上真正慢的是UTF-8语言环境

grep..
替换为
LC_ALL=C grep..
则命令的运行速度将提高100倍以上


Linux可能也是如此,除非给定的Linux发行版可能更倾向于默认使用C环境。

这可能会运行得更好一点,而且还可以消除您需要另一个管道的问题

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

如果你减少使用过多的管道和无用的猫,它可能会更快

$ awk '{ a[toupper(substr($0,1,2))]++ } END{for(i in a) print i,a[i] }' file

ʞɔıu,这一定是我见过的最酷的帐户名之一。