grep -i -A 5 -B 5 'db_pd.Clients' eightygigsfile.sql
这已经在相当强大的Linux服务器上运行了一个小时,否则不会超载。 grep的替代方案?关于我的语法有什么可以改进的,(egrep,fgrep更好吗?)
该文件实际上位于与另一台服务器的挂载共享的目录中,但实际的磁盘空间是本地的,所以不应该有任何区别?
grep占用了高达93%的CPU
答案 0 :(得分:125)
以下是一些选项:
1)使用LC_ALL=C
前缀grep命令以使用C语言环境而不是UTF-8。
2)使用fgrep
,因为您正在搜索固定字符串,而不是正则表达式。
3)如果您不需要,请删除-i
选项。
所以你的命令变为:
LC_ALL=C fgrep -A 5 -B 5 'db_pd.Clients' eightygigsfile.sql
如果将文件复制到RAM磁盘,速度也会更快。
答案 1 :(得分:26)
如果您有多核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
标志设置最大匹配数。答案 2 :(得分:10)
一些微不足道的改进:
如果可以,请删除-i选项,不区分大小写非常慢。
将.
替换为\.
单点是匹配任何字符的正则表达式符号,也很慢
答案 3 :(得分:3)
两行攻击:
-i
,还是有可能摆脱它?grep
是单线程的,因此您可能希望在不同的偏移量下启动更多它们。答案 4 :(得分:1)
< eightygigsfile.sql parallel -k -j120% -n10 -m grep -F -i -C 5 'db_pd.Clients'
如果您需要搜索多个字符串,grep -f strings.txt可以节省大量时间。以上是我正在测试的内容的翻译。 -j和-n选项值似乎最适合我的用例。 -F grep也有很大的不同。