mac下grep有bug

mac下,grep配合xargs会有bug
这个bug,会导致CPU占用持续200%,terminal假死,机器滚烫:

复现方法,是在代码根目录执行

1
find . -name *.java | xargs grep -ri "文件过多我会死循环"

其实,这个命令在Ubuntu下面执行,是毫无压力的。多少文件都可以grep

在Mac下面, 这个命令中,grep前面的find . -name *.java | xargs是很快执行完的, 跟grep一配合, 文件一多,就死掉了。单纯grep -ri "文件过多我会死循环" 也不会死。

grep的替代者ack

ack的安装

ack官网, mac下的安装方法:

1
brew install ack

ack的使用

  • 速度与find 加grep差不多,7G的目录下, 搜一段java文本,也就不到10秒
  • ack 要搜索的字符串, 比如: ack HttpURLConnectionImpl
  • 提速
    主要是 忽略一些目录 + 指定文件类型:
1
ack --ignore-dir=.git --ignore-dir=build --ignore-dir=.idea --type=java "要搜索的字符串"

比ack更牛逼的ag

ag是更快、跟方便的ack the_silver_searcher
Ack and Ag found the same results, but Ag was 34x faster

ag的用法

与ack用法基本一样,速度更快了,而且支持--java来限制搜索的文件类型的范围

ag的封装—jgrep

把这个放到bashrc里面,变成好用的函数jgrep:

1
2
3
4
5
6
7
8
9
function jgrep()
{
ag -U --stats --java "$@"
}

function resgrep()
{
ag -U --stats --xml "$@"
}

就可以这样用了:

1
jgrep HttpURLConnectionImpl