wie kann man in einer Datei nach „einschließen“ und „einen anderen Begriff ausschließen“ suchen?

wie kann man in einer Datei nach „einschließen“ und „einen anderen Begriff ausschließen“ suchen?

Ich versuche, eine Grep-Suche zu erstellen, die den Begriff einschließen und einen anderen Begriff ausschließen muss. Ich versuche, mehrere -E-„Muster“-Optionen zu verwenden, aber das hat nicht funktioniert.

Hier ist ein Beispiel für einen Befehl, den ich ausprobiert habe.

grep -Ei "\,17\:31" | grep -Eiv "10\.10\.210\.154" file.csv

aber die Ausgabeergebnisse entsprechen nur der zweiten Einschränkung grep -Eiv "10.10.210.154"

Antwort1

Angenommen, Sie möchten finden \,17\:31, aber nicht von IP10\.10\.210\.154

Dies kannst du verwenden.

grep -Ei "\,17\:31" file.csv | grep -Eiv "10\.10\.210\.154" 

Antwort2

Notiz:die andere Antwortsollte funktionieren, erklärt aber nichts; daher meine erklärende Antwort.

Sie haben dem zweiten gesagt , greper solle lesen file.csv, also tut er das. Er ignoriert seine Standardeingabe, weil dies das ist, was er greptut, wenn er mit Dateien arbeitet.

Tatsächlich grepverhält sich der zweite so, als wäre der erste nicht vorhanden. Er wird beendet, nachdem die Datei verarbeitet und die Ausgabe (sofern vorhanden) gedruckt wurde.

Der erste grepwartet auf eine Eingabe (normalerweise über die Tastatur, wenn er in einer interaktiven Shell ausgeführt wird). Er kann viele Zeilen annehmen und sogar viele (passende) Zeilen auf seiner Standardausgabe drucken, bis der Pipe-Puffer entscheidet, die Ausgabe an den zweiten weiterzuleiten grep. Wenn der zweite dann grepnicht mehr vorhanden ist, grepwird der erste benachrichtigt, dass die Pipe defekt ist; er wird beendet.

Oder Sie können Ctrl+ drücken D, um das Ende der Eingabe anzuzeigen; oder Sie können Ctrl+ drücken C, um das erste grep(und das zweite, falls es noch aktiv ist) zu beenden. Dies wird Ihren Datenfluss jedoch nicht reparieren.

Ein richtiger Datenfluss sieht folgendermaßen aus: Der Erste muss grepdie Datei lesen und dann das Ergebnis an den Zweiten weiterleiten:

grep -Ei "\,17\:31" file.csv | grep -Eiv "10\.10\.210\.154"
# or
<file.csv grep -Ei "\,17\:31" | grep -Eiv "10\.10\.210\.154"

Die letztere Syntax hat mindestens einen Vorteil, der am Ende erläutert wird.dies ist eine weitere Antwort von mir.

verwandte Informationen