我目前在使用 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 …