Wie gertvdijk betont, ist dieser Befehl möglicherweise ineffizient, sucht jedoch nach allen Zeilen, die sowohl keyword1 als auch keyword2 enthalten. Wenn Sie sie in verschiedenen Farben hervorheben möchten, können Sie verwenden
Dadurch wird Keyword2 blau hervorgehoben. Der mtTeil bedeutet, dass grepmit diesem CSI-Code übereinstimmender Text hervorgehoben wird , und 01;34bedeutet "fetter blauer Vordergrund auf normalem Hintergrund".
+1 für detaillierte Erklärungen und Anpassungsoptionen für den Anwendungsfall!
gertvdijk
Komisch, wenn ich das mit grep -R --color = always keyword1 versuche. | grep keyword2 // Nur das erste Keyword wird hervorgehoben. Wie könnte ich Ihre Antwort anpassen, um mit rekursiver Suche zu arbeiten?
TenLeftFingers
1
Das ist seltsam, grep -R --color=always keyword1 . | grep keyword2sollte funktionieren. Leiten Sie die Ausgabe erneut um (z. B. durch Weiterleiten der Sekunde grepan less -R)? In diesem Fall müssen Sie --color=alwaysauch die zweite hinzufügen .
Daniel H
Gute Antwort! Um beides hervorzuheben, --color=autowäre für die Sekunde grepunmittelbar danach ein erforderlich 'keyword2'.
Luis
@ Luis Ja, Sie haben Recht, dass Grep zumindest häufig standardmäßig keine Farbe verwendet (obwohl dies eine Option zum Konfigurieren der Zeit sein könnte? Ich glaube nicht, dass ich das 2013 außer Kraft gesetzt hatte, als es auf meinem Computer ohne diese Option funktionierte…). Ich --color=alwayshabe die Antwort ergänzt, weil du sie vielleicht weiterleiten willst lessoder so.
Daniel H
3
Versuchen Sie es mit regulären Ausdrücken, anstatt sie an eine andere Instanz weiterzuleiten grep, z.
grep -E "\<foo\>.*\<bar\>" file
Dies beschränkt sich leider nur auf übereinstimmende Zeilen, in denen die Schlüsselwörter in dieser Reihenfolge übereinstimmen. Wie auch immer, die Verwendung von grepin Ihrer Frage ist eher ineffizient und Sie sollten es vermeiden. Die Antwort von @DanielH ist für Ihren Fall wahrscheinlich viel einfacher.
Für ein 'oder' Matching von Keywords verwende ich dies regelmäßig:
Ich denke, dass das OP nur Zeilen möchte, die beide Schlüsselwörter enthalten (der Befehl, den Sie gaben, gibt alle Zeilen an, die eine von beiden enthalten).
Daniel H
@DanielH Danke für den Hinweis. Ich habe meine Antwort aktualisiert.
gertvdijk
Funktioniert das nicht immer noch nur, wenn foo vor der Bar kommt? Ich weiß nicht, ob es einen besseren Weg gibt als foo.*bar|bar.*foo, oder ob dies für diesen Fall überhaupt notwendig ist (das scheint eine Protokolldatei zu sein, die wahrscheinlich eine Standardreihenfolge für die Schlüsselwörter haben würde). Ich habe meine Antwort hinzugefügt, bevor Sie Ihre aktualisiert haben, aber ich behalte sie für den Fall bei, dass verkettete greps wirklich erforderlich sind (oder zu einem anderen Zeitpunkt sollte keine farbige Ausgabe an das Terminal gesendet werden, z. B. grep | less -R).
grep -R --color=always keyword1 . | grep keyword2
sollte funktionieren. Leiten Sie die Ausgabe erneut um (z. B. durch Weiterleiten der Sekundegrep
anless -R
)? In diesem Fall müssen Sie--color=always
auch die zweite hinzufügen .--color=auto
wäre für die Sekundegrep
unmittelbar danach ein erforderlich'keyword2'
.--color=always
habe die Antwort ergänzt, weil du sie vielleicht weiterleiten willstless
oder so.Versuchen Sie es mit regulären Ausdrücken, anstatt sie an eine andere Instanz weiterzuleiten
grep
, z.Dies beschränkt sich leider nur auf übereinstimmende Zeilen, in denen die Schlüsselwörter in dieser Reihenfolge übereinstimmen. Wie auch immer, die Verwendung von
grep
in Ihrer Frage ist eher ineffizient und Sie sollten es vermeiden. Die Antwort von @DanielH ist für Ihren Fall wahrscheinlich viel einfacher.Für ein 'oder' Matching von Keywords verwende ich dies regelmäßig:
quelle
foo.*bar|bar.*foo
, oder ob dies für diesen Fall überhaupt notwendig ist (das scheint eine Protokolldatei zu sein, die wahrscheinlich eine Standardreihenfolge für die Schlüsselwörter haben würde). Ich habe meine Antwort hinzugefügt, bevor Sie Ihre aktualisiert haben, aber ich behalte sie für den Fall bei, dass verkettetegrep
s wirklich erforderlich sind (oder zu einem anderen Zeitpunkt sollte keine farbige Ausgabe an das Terminal gesendet werden, z. B.grep | less -R
).