在非常大的文件中快速搜索字符串

use*_*540 23 linux bash grep

在包含字符串的文件中搜索行的最快方法是什么.我有一个包含要搜索的字符串的文件.这个小文件(smallF)包含大约50,000行,看起来像:

stringToSearch1
stringToSearch2
stringToSearch3

我必须在一个更大的文件中搜索所有这些字符串(大约1亿行).如果此较大文件中的任何行包含搜索字符串,则会打印该行.

到目前为止,我提出的最佳方法是

grep -F -f smallF largeF
Run Code Online (Sandbox Code Playgroud)

但这不是很快.在smallF中只有100个搜索字符串,大约需要4分钟.对于超过50,000个搜索字符串,将花费大量时间.

有更有效的方法吗?

cb0*_*cb0 19

我曾经注意到使用-E或多个-e参数比使用更快-f.请注意,这可能不适用于您的问题,因为您在较大的文件中搜索50,000个字符串.但是,我想向您展示可以做什么以及可能值得测试的内容:

这是我详细注意到的:

有1.2GB文件填充随机字符串.

>ls -has | grep string
1,2G strings.txt

>head strings.txt
Mfzd0sf7RA664UVrBHK44cSQpLRKT6J0
Uk218A8GKRdAVOZLIykVc0b2RH1ayfAy
BmuCCPJaQGhFTIutGpVG86tlanW8c9Pa
etrulbGONKT3pact1SHg2ipcCr7TZ9jc
.....
Run Code Online (Sandbox Code Playgroud)

现在我想使用不同的grep方法搜索字符串"ab","cd"和"ef":

  1. 使用不带标志的grep,一次搜索一个:

    grep"ab"strings.txt> m1.out
    2,76s用户0,42s系统96%cpu 3,313总计

    grep"cd"strings.txt >> m1.out
    2,82s用户0,36s系统95%cpu 3,322总计

    grep"ef"strings.txt >> m1.out
    2,78s用户0,36s系统94%cpu 3,360总计

所以总共搜索需要将近10秒.

  1. -f在search.txt中使用grep with flag和search strings

    >cat search.txt
     ab
     cd
     ef
    
    >grep -F -f search.txt strings.txt > m2.out  
    31,55s user 0,60s system 99% cpu 32,343 total
    
    Run Code Online (Sandbox Code Playgroud)

由于某些原因,这需要将近32秒.

  1. 现在使用多个搜索模式 -e

    grep -E "ab|cd|ef" strings.txt > m3.out  
    3,80s user 0,36s system 98% cpu 4,220 total
    
    Run Code Online (Sandbox Code Playgroud)

    要么

    grep --color=auto -e "ab" -e "cd" -e "ef" strings.txt > /dev/null  
    3,86s user 0,38s system 98% cpu 4,323 total
    
    Run Code Online (Sandbox Code Playgroud)

使用的第三种方法-E只花了4.22秒来搜索文件.

现在让我们检查结果是否相同:

cat m1.out | sort | uniq > m1.sort  
cat m3.out | sort | uniq > m3.sort
diff m1.sort m3.sort
#
Run Code Online (Sandbox Code Playgroud)

diff不产生输出,这意味着找到的结果是相同的.

也许想试一试,否则我建议你看一下"最快可能的grep"这个帖子,看看Cyrus的评论.


小智 6

您可能想尝试siftag。Sift 特别列出了一些与 grep 相比相当令人印象深刻的基准。