linux - 在 zip 文件中搜索字符串的最快 grep
问题描述
我有一个多达 5 万个名字的列表。我需要在日志中搜索,那些在多个 zip 文件中。这些 zip 文件位于不同的文件夹中并且很大(最大 450GB)。一个zip文件中有多个文件。
现在我正在迭代每个 zip 文件和每个文件的日志文件并在其中搜索名称。
cd /disk1/ABCDEFArchive/
while read pl; do
echo Searching $pl
for i in 3 3-AB 3-CD 3-EF 4 4-AB 4-CD 4-EF 5 5-AB 5-CD 5-EF
do
cd web$i
for j in 2017-09 2017-10 2017-11 2017-12 2017-01 2017-02
do
for k in $(unzip -l ABCDEF-${j}.zip | awk '{print $4}' | grep ABCDEF)
do
echo "searching $pl in web$i ===>>> ABCDEF-${j}.zip ===>>> $k "
isexists=$(unzip -p ABCDEF-${j}.zip $k | grep "=${pl}" | head -1 )
if [[ ! -z "$isexists" ]]; then
mysql -e "update test.product_list_tobedeleted set foundinlogs=1 where list_name =\"${pl}\";"
echo "$pl@@@$isexists" >>${ScriptPath}/ProductlistFound.csv
break 3
fi
done
done
cd ..
done
但它自一个月以来工作非常缓慢,仍然以 3000 的名义运行
我还尝试了更多的工作方法,比如在 zip 文件中查找而不在每个日志文件中进行迭代等,但这些情况更糟。
解决方案
为了有效地搜索 zip 文件,一些人建议尝试使用非常类似于 grep 的ugrep ,但也可以使用并行线程有效地搜索 zip/tar/cpio/pax 文件。如果找到模式匹配,则使用选项ugrep -l -z PATTERN
生成输出结果,或者如果找到模式匹配,则仅测试其出口ugrep -q -z PATTERN
为零(成功)的出口。在 的情况下-q
,ugrep 在找到模式匹配后不会继续解压缩和搜索 zip 文件,这应该会更快。使用选项-F
来搜索字符串而不是正则表达式。
推荐阅读
- php - htaccess 以子域作为变量重写
- redirect - Traefik 合并斜线
- python - Django 看不到西里尔文文件夹名称和文件
- jenkins - Jenkinsfile 不会替换变量
- linux - 如果没有像我期望的那样处理 Bash 脚本
- vue.js - VueJs 3 + Vuetify:不能在 IE 和 Edge 中工作
- reactjs - 电话和桌面是否可以有不同的实现?
- php - PHPunit 警告错误测试套件不是预期的
- javascript - 在 Puppeteer 中将数据输入到多个表单输入中
- javascript - 在Javascript中的for循环中返回promise的有效方法是什么