Procura por duas strings dentro de arquivos zip

1

Espero que alguém possa ajudar.

Eu tenho uma série de arquivos zip. Esses arquivos zip contêm arquivos de e-mail (.eml) Eu preciso encontrar todos os arquivos entre duas pessoas.

Eu posso encontrar facilmente usando uma resposta que encontrei aqui

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

É encontrar o segundo nome nos arquivos identificados com os quais estou lutando.

Eu tentei um segundo grep e zip grep no arquivo sem sucesso.

Qualquer ajuda muito apreciada.

    
por Richard 29.08.2013 / 14:43

1 resposta

1

Se os padrões não estiverem necessariamente na mesma linha, o simples zipgrep não poderá fazê-lo; você precisará envolvê-lo em um pequeno script que verifique se ambos os padrões foram encontrados no mesmo arquivo. Tente algo como:

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

Isso irá procurar cada arquivo zip por pat1 , se ele encontrar (isso é o que o && significa) ele irá procurar por pat2 e se achar isso também, irá imprimir o nome do arquivo. Estou redirecionando a saída padrão ( >/dev/null ) para que somente os nomes dos arquivos sejam impressos. Se você quiser ver as linhas relevantes também, faça isso:

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

OK, isso imprimirá o arquivo zip e o nome do arquivo correspondente de dentro do arquivo zip. Ele cria um diretório temporário ( mktemp -d ), descompacta cada arquivo zip nele e, em seguida, exclui o diretório. Se você estiver trabalhando com arquivos grandes que demorem um pouco, mas não acho que haja alguma maneira de evitá-lo.

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;
    
por 29.08.2013 / 15:35

Tags