在unix中快速查找文件中的字符串的方法

时间:2012-11-29 09:32:01

标签: unix

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

$grep 2005057488 filename

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

3 个答案:

答案 0 :(得分:17)

grep通常和它一样快。它只针对一件事而且只针对一件事 - 而且它做得非常好。您可以阅读here

的原因

然而,为了加快速度,你可以尝试一些事情。首先,看起来你正在寻找的模式是一个固定的字符串。幸运的是,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通常很慢,您可以尝试通过设置环境LANG=C来禁用国家语言支持(NLS)。因此,您可以尝试这种混合物:

LANG=C grep -F "2005057488" file

第三,在您的问题中不清楚,但如果您只是尝试查找文件中是否存在某个内容,您还可以尝试添加最多次以查找该模式。因此,-m 1时,grep会在找到第一个匹配项后立即退出。您的命令现在看起来像这样:

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

最后,如果你有一个多核CPU,你可以给GNU parallel一个。它甚至带有explanation of how to use it with grep。要为每个核心运行1.5个作业,并为grep提供1000个参数:

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

grep并行使用--pipe大文件{/ 1}:

< bigfile parallel --pipe grep STRING

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

< bigfile parallel --pipe --block 10M grep STRING

答案 1 :(得分:2)

grep比sed工作得更快。

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

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

答案 2 :(得分:0)

sed -n '/2005057488/p' filename

不确定这是否比grep更快。