我想在 unix 的文件中查找字符串模式。我使用以下命令:
$grep 2005057488 filename
但是文件包含数百万行,我有很多这样的文件。除了grep之外,什么是最快的获取模式的方法。
我想在 unix 的文件中查找字符串模式。我使用以下命令:
$grep 2005057488 filename
但是文件包含数百万行,我有很多这样的文件。除了grep之外,什么是最快的获取模式的方法。
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
grep 的工作速度比 sed 快。
$grep 2005057488 filename
$sed -n '/2005057488/p' filename
仍然两者都可以在文件中获取特定的字符串
sed -n '/2005057488/p' filename
不确定这是否比 grep 快。