Regex 为什么这个grep过滤器速度慢?
我想得到BSD dict单词列表中每个单词的前两个字母,不包括那些只以一个字母开头的单词 如果没有一个字母排除,它的运行速度非常快: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
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,这一定是我见过的最酷的帐户名之一。