2008-12-12 6 views
33

Ich versuche, Grep mit -v für Invert-Match zusammen mit -e für regulären Ausdruck zu verwenden. Ich habe Probleme, die Syntax richtig zu machen.Verwenden von Grep mit regulärem Ausdruck, um Übereinstimmungen herauszufiltern

Ich versuche, so etwas wie

tail -f logFile | grep -ve "string one|string two" 

Wenn ich es tun, um diese Art und Weise nicht filtert Wenn ich es

tail -f logFile | grep -ev "string one|string two" 

ich

grep: string one|string two: No such file or directory 

ändern Ich habe versucht, mit() oder Anführungszeichen, aber ich konnte nichts finden, was funktioniert.

Wie kann ich das tun?

Antwort

50

Das Problem ist, dass Sie standardmäßig Ihre | 's entkommen müssen, um richtige Abwechslung zu erhalten. Das heißt, grep interpretiert "foo | bar" nur als Übereinstimmung mit der literalen Zeichenfolge "foo | bar", während das Muster "foo \ | bar" (mit einem maskierten |) "foo" oder "bar" entspricht.

Um dieses Verhalten zu ändern, verwenden Sie die -E-Flag:

tail -f logFile | grep -vE 'string one|string two' 

Alternativ Verwendung egrep, die grep -E entspricht:

tail -f logFile | egrep -v 'string one|string two' 

Auch die -e optional ist, Es sei denn, Ihr Muster beginnt mit einem buchstabengetreuen Bindestrich. grep übernimmt automatisch das erste Nicht-Options-Argument als Muster.

+0

heh, lernen Jeden Tag etwas neues, ich habe nie zuvor die -E Flagge auf Grep bemerkt. – Jay

+0

funktioniert diese Lösung für 'MacOS'? Ich versuche 'Geschichte | grep -vE 'ng | npm'', aber es funktioniert nicht wie erwartet. – Sergii

+0

@Sergii: Ja, die mit macOS (BSD grep) mitgelieferte Version von grep unterstützt vollständig die Flags "-v" und "-E". "Funktioniert nicht" ist eine vage Beschreibung, Sie müssen weitere Details angeben. Ich schlage vor, Sie stellen eine neue Frage, anstatt in den Kommentaren hier zu posten. –

5

Sie müssen das Pipe-Symbol entkommen, wenn -e verwendet wird:

tail -f logFile | grep -ve "string one\|string two" 

EDIT: oder, wie @Adam wies darauf hin, können Sie die -E-Flag verwenden:

tail -f logFile | grep -vE "string one|string two" 
+1

Ich testete den ersten Teil auf meinem System und es hatte die gewünschten Ergebnisse. Nicht sicher, was du falsch meinst. – Jay

Verwandte Themen