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;