Если шаблоны не обязательно находятся в одной строке, простой 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;