1

Надеюсь, кто-то может помочь.

У меня есть серия почтовых файлов. Эти zip-файлы содержат файлы электронной почты (.eml), которые мне нужны, чтобы найти все файлы между двумя людьми.

Я могу легко найти ответ, найденный здесь.

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

Он находит второе имя в идентифицированных файлах, с которыми я борюсь.

Я попытался второй grep и zip grep на файл безрезультатно.

Любая помощь с благодарностью.

1 ответ1

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;

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .