Wenn sich die Muster nicht unbedingt in derselben Zeile befinden, zipgrepmüssen Sie sie in ein kleines Skript einbinden, das prüft, ob beide Muster in derselben Datei gefunden wurden. Versuchen Sie etwas wie:
for z in 2013-*.zip ; do
zipgrep "pat1" $z >/dev/null &&
zipgrep "pat2" $z >/dev/null &&
echo $z;
done
Dadurch wird jede ZIP-Datei durchsucht pat1, wenn sie gefunden wird (das ist das, was das &&bedeutet), pat2und wenn sie dies ebenfalls findet, wird der Name der Datei gedruckt. Ich leite die Standardausgabe ( >/dev/null) um, sodass nur die Dateinamen gedruckt werden. Wenn Sie auch die relevanten Zeilen sehen möchten, gehen Sie stattdessen wie folgt vor:
for z in 2013-*.zip ; do
zipgrep "pat1" $z &&
zipgrep "pat2" $z &&
echo $z;
done
OK, dies druckt die Zip-Datei und den Namen der passenden Datei aus der Zip-Datei. Es erstellt ein temporäres Verzeichnis ( mktemp -d), entpackt jede Zip-Datei und löscht das Verzeichnis. Wenn Sie mit großen Dateien arbeiten, die eine Weile dauern, aber ich glaube, es gibt keine Möglichkeit, dies zu vermeiden.
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;