Ich möchte den Multi-Pattern-Match mit implizitem AND erhalten zwischen Mustern, d.h. äquivalent zum Ausführen mehrerer Greps in einer Sequenz:
grep pattern1 | grep pattern2 | ...
Wie konvertiert man es also in etwas wie?
grep pattern1 & pattern2 & pattern3
Ich würde gerne einzelnes grep verwenden, weil ich Argumente dynamisch aufbaue, also muss alles in einen String passen. Die Verwendung von Filter ist eine Systemfunktion, nicht grep, daher ist dies kein Argument dafür.
Verwechseln Sie diese Frage nicht mit:
grep "pattern1|pattern2|..."
Dies ist ein ODER Übereinstimmung mit mehreren Mustern.
Akzeptierte Antwort:
agrep
kann es mit dieser Syntax tun:
agrep 'pattern1;pattern2'
Mit GNU grep
, wenn es mit PCRE-Unterstützung erstellt wurde, können Sie Folgendes tun:
grep -P '^(?=.*pattern1)(?=.*pattern2)'
Mit ast grep
:
grep -X '.*pattern1.*&.*pattern2.*'
(Hinzufügen von .*
s als <x>&<y>
stimmt mit Zeichenfolgen überein, die mit <x>
übereinstimmen und <y>
genau , a&b
würde niemals übereinstimmen, da es keine solche Zeichenfolge gibt, die sein kann sowohl a
und b
gleichzeitig).
Wenn sich die Muster nicht überschneiden, können Sie möglicherweise auch Folgendes tun:
grep -e 'pattern1.*pattern2' -e 'pattern2.*pattern1'
Der beste portable Weg ist wahrscheinlich mit awk
wie schon erwähnt:
awk '/pattern1/ && /pattern2/'
Mit sed
:
sed -e '/pattern1/!d' -e '/pattern2/!d'
Bitte beachten Sie, dass all diese eine unterschiedliche Syntax für reguläre Ausdrücke haben.