我想在unix中找到文件中的字符串模式。我用下面的命令:
$grep 2005057488 filename
但文件包含数百万行,我有很多这样的文件。除了grep之外,获取模式的最快方法是什么。
答案 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更快。