grep -i -A 5 -B 5 'db_pd.Clients' eightygigsfile.sql
这已经在一个相当强大的 linux 服务器上运行了一个小时,否则它不会超载。grep的任何替代品?关于我的语法有什么可以改进的,(egrep,fgrep 更好?)
该文件实际上位于与挂载到另一台服务器共享的目录中,但实际的磁盘空间是本地的,所以应该没有任何区别?
grep 占用了高达 93% 的 CPU
这里有几个选项:
1) 为您的 grep 命令添加前缀LC_ALL=C
以使用 C 语言环境而不是 UTF-8。
2)使用fgrep
是因为您正在搜索固定字符串,而不是正则表达式。
3)删除-i
选项,如果你不需要它。
所以你的命令变成:
LC_ALL=C fgrep -A 5 -B 5 'db_pd.Clients' eightygigsfile.sql
如果将文件复制到 RAM 磁盘也会更快。
如果你有一个多核 CPU,我真的会推荐GNU parallel。要并行使用 grep 大文件:
< eightygigsfile.sql parallel --pipe grep -i -C 5 'db_pd.Clients'
根据您的磁盘和 CPU,读取更大的块可能会更快:
< eightygigsfile.sql parallel --pipe --block 10M grep -i -C 5 'db_pd.Clients'
您的问题并不完全清楚,但其他选项grep
包括:
-i
旗帜。-F
标志用于固定字符串LANG=C
-m
使用标志设置最大匹配数。一些微不足道的改进:
删除 -i 选项,如果可以的话,不区分大小写非常慢。
替换.
_\.
单点是匹配任意字符的正则表达式符号,也很慢
两条攻击线:
-i
,或者你有可能摆脱它吗?grep
是单线程的,因此您可能希望在不同的偏移量处启动更多它们。< eightygigsfile.sql parallel -k -j120% -n10 -m grep -F -i -C 5 'db_pd.Clients'
如果您需要搜索多个字符串, grep -f strings.txt 可以节省大量时间。以上是我目前正在测试的内容的翻译。-j 和 -n 选项值似乎最适合我的用例。-F grep 也有很大的不同。
尝试ripgrep
与 grep 相比,它提供了更好的结果。