小编Nic*_*ico的帖子

许多文件上的许多关键字的 Grep:加快速度

我目前在使用 grep 时面临“性能问题”。我试图在许多(想想 Linux 内核存储库大小)文件中找到许多(10,000+)个关键字的出现。目标是为每个关键字生成一种索引:

keyword: my_keyword
filepath 1
filepath 2
------
keyword: my_keyword2
...
Run Code Online (Sandbox Code Playgroud)

作为 shell 脚本的新手,我尝试了一些幼稚的方法:

while read LINE; do
    echo "keyword: "$LINE >> $OUTPUT_FILE
    grep -E -r --include='Makefile*' "($LINE)" . >> "$OUTPUT_FILE"
    echo "-----"
done < $KEYWORD_FILE
Run Code Online (Sandbox Code Playgroud)

这需要大约 45 分钟才能完成,并获得预期的结果。

注意:我搜索的所有关键字都位于一个文件中(“KEYWORD_FILE”,因此在任何开始之前都是固定的),并且可以在搜索开始之前确定要搜索的文件。我试图在搜索之前存储要搜索的文件列表:

file_set=( $(find . -name "Kbuild*" -o -name "Makefile*") )
Run Code Online (Sandbox Code Playgroud)

然后将 grep 调用替换为

echo {$file_set[*]} | parallel -k -j+0 -n 1000 -m grep -H -l -w "\($LINE\)" >> "$OUTPUT_FILE"
Run Code Online (Sandbox Code Playgroud)

大约需要一个小时才能完成……

问题:考虑到我可以使用我想要的任何技术,只要它符合 sh 标准,如何“更快”和/或更有效地完成这项工作?

也许grep不是使用的工具,我的使用parallel …

performance shell grep

5
推荐指数
1
解决办法
991
查看次数

标签 统计

grep ×1

performance ×1

shell ×1