142
 grep -i -A 5 -B 5 'db_pd.Clients'  eightygigsfile.sql

这已经在一个相当强大的 linux 服务器上运行了一个小时,否则它不会超载。grep的任何替代品?关于我的语法有什么可以改进的,(egrep,fgrep 更好?)

该文件实际上位于与挂载到另一台服务器共享的目录中,但实际的磁盘空间是本地的,所以应该没有任何区别?

grep 占用了高达 93% 的 CPU

4

6 回答 6

182

这里有几个选项:

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 磁盘也会更快。

于 2012-12-17T11:25:46.683 回答
40

如果你有一个多核 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标志用于固定字符串
  • 禁用 NLSLANG=C
  • -m使用标志设置最大匹配数。
于 2012-12-17T12:49:49.480 回答
10

一些微不足道的改进:

  • 删除 -i 选项,如果可以的话,不区分大小写非常慢。

  • 替换._\.

    单点是匹配任意字符的正则表达式符号,也很慢

于 2012-12-17T11:19:21.613 回答
3

两条攻击线:

  • 你确定,你需要-i,或者你有可能摆脱它吗?
  • 你有更多的核心可以玩吗?grep是单线程的,因此您可能希望在不同的偏移量处启动更多它们。
于 2012-12-17T11:18:06.523 回答
1
< eightygigsfile.sql parallel -k -j120% -n10 -m grep -F -i -C 5 'db_pd.Clients'  

如果您需要搜索多个字符串, grep -f strings.txt 可以节省大量时间。以上是我目前正在测试的内容的翻译。-j 和 -n 选项值似乎最适合我的用例。-F grep 也有很大的不同。

于 2018-01-18T03:10:09.640 回答
0

尝试ripgrep

与 grep 相比,它提供了更好的结果。

于 2021-08-25T08:10:15.420 回答