13

我想在 unix 的文件中查找字符串模式。我使用以下命令:

$grep 2005057488 filename

但是文件包含数百万行,我有很多这样的文件。除了grep之外,什么是最快的获取模式的方法。

4

3 回答 3

18

grep通常是尽可能快。它是为一件事和一件事而设计的——它做得很好。你可以在这里阅读为什么。

但是,为了加快速度,您可以尝试几件事。首先,看起来您正在寻找的模式是一个固定的字符串。幸运的是,grep有一个“固定字符串”选项:

-F, --fixed-strings
       Interpret PATTERN as a list of fixed strings, separated by newlines, any of which is to be matched. (-F is specified by POSIX.)

其次,因为grep通常在 上很慢UTF-8,您可以尝试通过设置 environment 来禁用国家语言支持(NLS)LANG=C。因此,您可以尝试这种混合物:

LANG=C grep -F "2005057488" file

第三,您的问题并不清楚,但如果您只尝试查找文件中是否存在一次,您也可以尝试添加最大次数来查找模式。因此, when -m 1,grep将在找到第一个匹配项后立即退出。您的命令现在可能如下所示:

LANG=C grep -m 1 -F "2005057488" file

最后,如果你有一个多核 CPU,你可以试试GNU 并行。它甚至附带了如何与 grep 一起使用它的说明。每个核心运行 1.5 个作业并给 1000 个参数grep

find . -type f | parallel -k -j150% -n 1000 -m grep -H -n STRING {}

grep并行使用的大--pipe文件:

< bigfile parallel --pipe grep STRING

根据您的磁盘和 CPU,读取更大的块可能会更快:

< bigfile parallel --pipe --block 10M grep STRING
于 2012-11-29T12:38:59.390 回答
2

grep 的工作速度比 sed 快。

$grep 2005057488 filename
$sed -n '/2005057488/p' filename

仍然两者都可以在文件中获取特定的字符串

于 2014-02-21T05:58:47.913 回答
0
sed -n '/2005057488/p' filename

不确定这是否比 grep 快。

于 2012-11-29T09:58:26.620 回答