grep 第二次更快

grep 第二次更快

假设我进行了一次耗时的递归grep搜索。看到结果后我想要不同的输出;例如我想添加-C 33 个上下文行的选项。我可以使用添加的新选项再次进行整个搜索,但我必须像以前一样等待。

有什么聪明的方法可以grep更快地执行第二次搜索吗?

答案1

第二次应该已经更快(如果grep是 I/O 绑定),因为文件应该位于操作系统的缓存中。

由于grep根本不保存任何状态并且仅适用于提供的输入参数,因此无法自行重用以前的结果grep

如果您经常遇到此问题,您可能需要研究桌面搜索引擎或文本索引以缩短搜索时间并提高结果。

答案2

如果文件仍在磁盘缓存中,则第二次搜索会更快。

如果你想加快搜索速度,就需要建立索引。这远远超出了 grep 的工作范围:它是一个搜索工具,而不是一个索引工具。命令行友好的全文索引?列出了一些索引工具。

您可以通过多种方式利用 grep 来加快重复搜索的速度。例如,首先获取匹配的文件列表grep -l。如果您的文件名不包含任何空格或 shell 通配符*?\[,您可以将文件名填充到变量中:

f=$(grep -l -r foo .)
grep foo $f
grep -C3 foo $f
grep foobar $f

答案3

您可以保存匹配文件列表并仅在匹配文件上执行 grep。会快很多。例如,您可以使用find+ grep

find . -type f -exec grep -l 'PATTERN' {} \+ | xargs grep -H -C 3 'PATTERN'

如果您需要grep在第一次运行后查看输出,find则有点困难,但仍然很容易。你只需要使用类似的东西

find -exec grep -H 'PATTERN' {} \+ | tee -a out.log |\
sed 's/^[^:]*://' | sort -u | xargs grep -C 3  'PATTERN'

输出将保存到 out.log 文件中。

答案4

  1. 你真的需要吗grep——你使用正则表达式吗?fgrep 快点。
  2. 根据手册页,GNUgrep有:“……在某些情况下,--mmap 会产生更好的性能……”(但它也有一些问题,请参阅手册页)。--mmap
  3. 只需保存 file: 匹配行的行号,然后不再重复grep- 您肯定不需要再次执行两次,不是吗?

相关内容