在 zip 档案中搜索两个字符串

在 zip 档案中搜索两个字符串

希望有人可以帮忙。

我有一系列 zip 文件。这些 zip 文件包含电子邮件文件 (.eml)。我需要查找两个人之间的所有文件。

我可以使用在这里找到的答案轻松找到其中一个

for z in 2013-*.zip ; do zipgrep "PATTERN" $z | sed "s/^/$z: /" ; done

它正在我正在努力寻找的已识别文件内的第二个名字。

我尝试对该文件进行第二次 grep 和 zip grep,但无济于事。

非常感谢您的帮助。

答案1

如果模式不一定在同一行,那么简单zipgrep是无法做到的,您需要将其包装在一个小脚本中,以检查是否在同一个文件中找到这两个模式。尝试类似以下操作:

for z in 2013-*.zip ; do 
   zipgrep "pat1" $z >/dev/null &&  
   zipgrep "pat2" $z >/dev/null && 
   echo $z; 
done

这将搜索每个 zip 文件pat1,如果找到(这就是 的意思&&),它将搜索pat2,如果也找到,它将打印文件的名称。我正在重定向标准输出(>/dev/null),以便只打印文件名。如果您还想查看相关行,请执行以下操作:

for z in 2013-*.zip ; do 
   zipgrep "pat1" $z &&  
   zipgrep "pat2" $z && 
   echo $z; 
done

好的,这将打印 zip 文件以及 zip 文件中匹配文件的名称。它会创建一个临时目录 ( mktemp -d),将每个 zip 文件解压到其中,然后删除该目录。如果您正在处理大文件,这将需要一段时间,但我认为没有任何方法可以避免它。

tmpdir=$(mktemp -d tmp.XXXXX); for z in 2013-*.zip ; do 
    zipgrep "pat1" $z >/dev/null && zipgrep "pat2" $z > /dev/null && 
    unzip $z -d $tmpdir >/dev/null 2>&1;
    for i in $tmpdir/*; do 
        grep "pat1" $i  >/dev/null && 
        grep "pat2" $i  >/dev/null && 
        echo "$z : $i" | sed "s/$tmpdir.//"; 
    done;
done; rm -rf $tmpdir;

相关内容