Ich versuche, grep
Linien zuzuordnen, die zwei verschiedene Zeichenfolgen enthalten. Ich habe Folgendes versucht, aber dies stimmt mit Zeilen überein, die entweder string1 oder string2 enthalten, was nicht das ist, was ich will.
grep 'string1\|string2' filename
Wie stimme ich also grep
nur mit den Zeilen überein , die beide Zeichenfolgen enthalten ?
Antworten:
Sie können verwenden
grep 'string1' filename | grep 'string2'
Oder,
grep 'string1.*string2\|string2.*string1' filename
quelle
grep -e "string1" -e "string2"
Ich denke, das haben Sie gesucht:
Ich denke, dass Antworten wie folgt:
Passen Sie nur den Fall an, in dem beide vorhanden sind, nicht der eine oder der andere oder beide.
quelle
grep -e "string1" -e "string2" filename
das gleiche tun?How do I match lines that contains *both* strings?
So suchen Sie nach Dateien, die alle Wörter in beliebiger Reihenfolge enthalten:
Der erste grep startet eine rekursive Suche (
r
), ignoriert case (i
) und listet (druckt) den Namen der Dateien auf, diel
für einen Begriff ('action'
mit einfachen Anführungszeichen) übereinstimmen ( ), der irgendwo in der Datei vorkommt.Die nachfolgenden Greps suchen nach den anderen Begriffen, wobei die Groß- und Kleinschreibung nicht berücksichtigt wird und die übereinstimmenden Dateien aufgelistet werden.
Die endgültige Liste der Dateien, die Sie erhalten, enthält diejenigen, die diese Begriffe enthalten, in beliebiger Reihenfolge an einer beliebigen Stelle in der Datei.
quelle
grep -ril 'foo' | xargs -d '\n' grep -il 'bar'
Wenn Sie
grep
eine-P
Option für eine begrenzteperl
Regex haben, können Sie diese verwendenDas hat den Vorteil, mit überlappenden Strings zu arbeiten. Die Verwendung von
perl
as ist etwas einfachergrep
, da Sie die und -Logik direkter angeben können:quelle
Ihre Methode war fast gut, nur das -w fehlte
quelle
grep -V
ist.grep -w 'regexp1\|regexp2' filename
Der
|
Operator in einem regulären Ausdruck bedeutet oder. Das heißt, entweder string1 oder string2 stimmen überein. Du könntest es tun:Dadurch werden die Ergebnisse des ersten Befehls in den zweiten grep weitergeleitet. Das sollte Ihnen nur Zeilen geben, die mit beiden übereinstimmen.
quelle
Sie könnten so etwas versuchen:
quelle
Und wie die Leute Perl und Python und verschlungene Shell-Skripte vorgeschlagen haben, hier ein einfacher awk- Ansatz:
Nachdem Sie sich die Kommentare zur akzeptierten Antwort angesehen haben: Nein, dies ist nicht mehrzeilig. aber das hat der Autor der Frage auch nicht verlangt.
quelle
Versuchen Sie nicht, grep dafür zu verwenden, sondern verwenden Sie stattdessen awk. Um 2 reguläre Ausdrücke R1 und R2 in grep abzugleichen, würde man denken, es wäre:
während in awk wäre es:
aber was ist, wenn
R2
sich mit oder eine Teilmenge von überschneidetR1
? Dieser grep-Befehl würde einfach nicht funktionieren, während der awk-Befehl dies tun würde. Können sagen , Sie Linien finden möchten , die enthaltenthe
undheat
:Dafür müssten Sie 2 Greps und eine Pipe verwenden:
und natürlich, wenn Sie tatsächlich verlangt hätten, dass sie getrennt sind, können Sie in awk immer den gleichen regulären Ausdruck schreiben, den Sie in grep verwendet haben, und es gibt alternative awk-Lösungen, bei denen die regulären Ausdrücke nicht in jeder möglichen Reihenfolge wiederholt werden.
Abgesehen davon, was wäre, wenn Sie Ihre Lösung auf 3 reguläre Ausdrücke R1, R2 und R3 erweitern möchten. In grep wäre das eine dieser schlechten Entscheidungen:
während in awk wäre es das prägnante, offensichtliche, einfache, effiziente:
Was wäre, wenn Sie tatsächlich die Literalzeichenfolgen S1 und S2 anstelle der regulären Ausdrücke R1 und R2 abgleichen möchten? Sie können das einfach nicht in einem Aufruf von grep tun. Sie müssen entweder Code schreiben, um alle RE-Metachare zu umgehen, bevor Sie grep aufrufen:
oder wieder 2 greps und eine Pfeife verwenden:
Dies sind wiederum schlechte Entscheidungen, während Sie mit awk einfach einen Zeichenfolgenoperator anstelle des regulären Ausdrucksoperators verwenden:
Was wäre, wenn Sie 2 reguläre Ausdrücke in einem Absatz und nicht in einer Zeile abgleichen möchten? Kann nicht in grep gemacht werden, trivial in awk:
Wie wäre es mit einer ganzen Datei? Wiederum kann es in awp nicht in grep und trivial gemacht werden (diesmal verwende ich GNU awk für Multi-Char-RS aus Gründen der Übersichtlichkeit, aber es ist nicht viel mehr Code in einem awk, oder Sie können ein Control-Char auswählen, von dem Sie wissen, dass es nicht funktioniert in der Eingabe sein, damit der RS dasselbe tut):
Wenn Sie also mehrere reguläre Ausdrücke oder Zeichenfolgen in einer Zeile, einem Absatz oder einer Datei suchen möchten, verwenden Sie nicht grep, sondern awk.
quelle
awk '/R1/ && /R2/'
Groß- und Kleinschreibung nicht zu beachten?awk -v IGNORECASE=1 '/R1/ && /R2/'
und mit jedem awkawk '{x=toupper($0)} x~/R1/ && x~/R2/'
GNU grep Version 3.1
quelle
Gefundene Zeilen, die nur mit 6 Leerzeichen beginnen und enden mit:
quelle
Angenommen, wir müssen die Anzahl mehrerer Wörter in einer Datei-Testdatei ermitteln. Es gibt zwei Möglichkeiten
1) Verwenden Sie den Befehl grep mit dem Regex-Übereinstimmungsmuster
2) Verwenden Sie den Befehl egrep
Mit egrep müssen Sie sich keine Gedanken über den Ausdruck machen und nur Wörter durch ein Rohrtrennzeichen trennen.
quelle
git grep
Hier ist die Syntax
git grep
mit mehreren Mustern:Sie können auch Muster mit kombinieren Booleschen Ausdrücken wie
--and
,--or
und--not
.Suchen Sie
man git-grep
nach Hilfe.Weitere zu berücksichtigende Parameter:
Um das Muster Typ zu ändern, können Sie auch
-G
/--basic-regexp
(Standard),-F
/--fixed-strings
,-E
/--extended-regexp
,-P
/--perl-regexp
,-f file
und andere.Verbunden:
Informationen zum ODER- Betrieb finden Sie unter:
quelle
Platzieren Sie die Zeichenfolgen, nach denen Sie suchen möchten, in einer Datei
Dann suchen Sie mit -f
quelle
wird Zeile mit Zeichenfolge1 und Zeichenfolge2 in beliebiger Reihenfolge erhalten
quelle
Dies funktioniert für exakte Wortübereinstimmung und übereinstimmende Wörter ohne Berücksichtigung der Groß- und Kleinschreibung, für die -i verwendet wird
quelle
für mehrzeiliges Spiel:
oder
Wir müssen nur das Zeilenumbruchzeichen entfernen und es funktioniert!
quelle
Sie sollten so haben
grep
:quelle
Ich habe oft das gleiche Problem wie Sie und habe gerade ein Skript geschrieben:
Verwendung:
Sie können es in .bashrc ablegen, wenn Sie möchten.
quelle
Wenn beide Zeichenfolgen nacheinander angeordnet sind, setzen Sie auf
grep
Befehl ein Muster dazwischen :Beispiel, wenn die folgenden Zeilen in einer Datei mit dem Namen enthalten sind
Dockerfile
:So rufen Sie die Zeile ab, die die Zeichenfolgen enthält:
FROM python
und verwenden Sieas build-python
dann:Dann zeigt die Ausgabe nur die Zeile, die beide Zeichenfolgen enthält :
quelle
ripgrep
Hier ist das Beispiel mit
rg
:Es ist eines der schnellsten Grepping-Tools, da es auf der Regex-Engine von Rust basiert, die endliche Automaten, SIMD und aggressive Literal-Optimierungen verwendet, um die Suche sehr schnell zu machen.
Verwenden Sie es, insbesondere wenn Sie mit großen Datenmengen arbeiten.
Siehe auch zugehörige Funktionsanforderung bei GH-875 .
quelle
string2
zuvor angezeigt wirdstring1
. Die einfachste Lösung für dieses Problem istrg string1 file.txt | rg string2
.