grep全磁盘搜索字符串耗时过长及输出相关技术问题咨询
解决grep扫描NVMe SSD速度过慢及错误信息与进度平衡的问题
我太懂你这种崩溃感了——用grep扫20GB数据居然耗了53小时,还是在性能旗舰级的三星Pro 960 NVMe SSD上,这效率简直离谱!而且还得在「屏蔽烦人的错误信息」和「靠错误信息判断扫描进度」之间纠结,确实头疼。下面给你分享几个实用的解决思路:
一、先搞懂为啥grep在NVMe上这么慢
grep是个老牌工具,但默认设计没充分利用NVMe的高并行读写特性:
- 默认单线程处理,没法榨干NVMe的带宽
- 逐个文件打开扫描,小文件密集场景下,文件IO的开销远大于搜索本身
- 默认会尝试解析二进制文件,白白浪费算力
二、换用更快的替代工具(最推荐!)
别死磕grep了,现在有专门优化过的搜索工具,速度能提升几十甚至上百倍:
- ripgrep(
rg):目前速度最快的搜索工具之一,默认多线程、自动跳过二进制文件/隐藏文件/系统文件,用法和grep几乎一致:rg "你要找的字符串" / - The Silver Searcher(
ag):比grep快很多,同样自动忽略版本控制目录、二进制文件,适合日常搜索:ag "你要找的字符串" /
这两个工具在NVMe上扫20GB数据,大概率几分钟就能搞定,比53小时靠谱多了。
三、如果非要用grep,这么优化提速
要是你坚持用grep,调整参数能大幅提升速度:
- 开启多线程:根据你的CPU核心数设置线程数,比如4核就设
--threads=4:grep -r --threads=4 "目标字符串" / - 跳过二进制文件:避免在二进制文件上浪费时间,用
--binary-files=without-match参数:grep -r --binary-files=without-match "目标字符串" / - 用固定字符串模式:如果搜索的不是正则表达式,加
-F参数(等价于fgrep),搜索速度会快很多:grep -rF --threads=4 "目标字符串" /
四、平衡错误信息与扫描进度的小技巧
不想用2>/dev/null完全屏蔽错误,但又想知道扫描进度?试试这两个方法:
- 错误信息存日志+实时查看:把错误信息定向到日志文件,同时开另一个终端实时监控,既不干扰搜索输出,又能通过错误信息判断进度:
比如你会看到类似这样的错误(也能知道当前扫到哪些目录了):# 执行搜索,错误信息存到grep_errors.log grep -r "目标字符串" / 2>grep_errors.log # 新开终端执行,实时看错误信息 tail -f grep_errors.loggrep: /proc/3456/mem: Permission denied
grep: /root/.ssh/id_rsa: Permission denied - 用
pv显示进度条:结合find和pv,能直观看到扫描的字节进度,错误信息依旧输出到终端:find / -type f -print0 | pv -s $(du -sb / | awk '{print $1}') | xargs -0 grep "目标字符串"
内容的提问来源于stack exchange,提问作者WinEunuuchs2Unix
相关产品推荐
相关产品推荐

