Wie durchsuche ich mit grep das aktuelle Verzeichnis nach allen Dateien mit der Zeichenfolge "Hallo", in denen jedoch nur .h- und .cc-Dateien angezeigt werden?

138

Wie verwende ich grep, um das aktuelle Verzeichnis nach allen Dateien zu durchsuchen, die die Zeichenfolge "Hallo" enthalten, und nur .h- und .cc-Dateien anzuzeigen?

Paketüberfluss
quelle

Antworten:

161
grep -r --include=*.{cc,h} "hello" .

Dies lautet: Suchen Sie rekursiv (auch in allen Unterverzeichnissen) nach allen .cc ODER .h-Dateien, die in diesem .(aktuellen) Verzeichnis "Hallo" enthalten

Aus einer anderen Stackoverflow-Frage

Paketüberfluss
quelle
5
Im ursprünglichen Beitrag haben Sie "aktuelles Verzeichnis" gesagt und nichts darüber, es rekursiv oder in Unterverzeichnissen zu benötigen (mir ist klar, dass Sie es in einem späteren Beitrag erwähnt haben). Für diejenigen, die daran interessiert sind, wie es nur im aktuellen Verzeichnis gemacht wird, ist es grep -si "hello" --include=*.{cc,h} ./* ./.*(durchsucht auch versteckte Dateien). Hier ist eine generische Version, um in allen / versteckten Dateien nach einer Zeichenfolge zu suchen : grep -s "hello" * .*. Vielleicht am allgemeinsten nützlich (und am einfachsten), durchsucht dies alle nicht versteckten Dateien nach "Hallo": grep -si "hello" ./* Dank dieses Beitrags: askubuntu.com/a/777456
jbobbins
1
grep -r --include=*.{java,py} "hello" .
Aus irgendeinem Grund funktioniert dies unter macOS nicht, selbst wenn das GNU grep-Dienstprogramm verwendet wird.
xApple
49

Sie können Platzhalter übergeben, anstatt Dateinamen anzugeben oder stdin zu verwenden.

grep hello *.h *.cc
Donald Miner
quelle
Ich brauche auch alle Unterverzeichnisse
Stackoverflow
Das Hinzufügen -Rfunktioniert leider nicht. Es erweitert das *vor dem rekursiven Gehen.
Donald Miner
Noufals Antwort ist, wonach Sie suchen, wenn Sie Unterverzeichnisse benötigen
Donald Miner
8
@Jammin Das solltest du dir klar machen, wenn du die Frage stellst. Diese Antwort ist die "richtige" Antwort auf Ihre gestellte Frage.
Jordanm
$ grep -R hello *# finden aus allen Wörtern enthalten Hallo (einschließlich Unterverzeichnis)
19

find . -name \*.cc -print0 -or -name \*.h -print0 | xargs -0 grep "hello".

Überprüfen Sie die Handbuchseiten auf findund xargsfür Details.

Noufal Ibrahim
quelle
1
Sie müssen ein -print0nach dem haben, '*.cc'da Sie sonst keine Aktion für diesen Teil der Suche haben. Oder Sie müssen dort Klammern einfügen : find . \( -name '*.cc' -or -name '*.h' \) -print0.
Jonathan Leffler
Danke, dass du das bemerkt hast. Ich habe die Antwort bearbeitet, um sie zu "reparieren".
Noufal Ibrahim
3
Sie können auch die find -exec +Syntax anstelle von xargs verwenden
jordanm
@jordanm: Ja, -exec grep "hello" {} +wobei das Klammerpaar die Dateinamen darstellt. Guter Vorschlag.
Jonathan Leffler
9

So rekursiv im aktuellen Verzeichnis suchen:

grep -r 'myString' .
AB Abhi
quelle
5

Wenn Sie eine rekursive Suche benötigen, haben Sie verschiedene Möglichkeiten. Sie sollten überlegen ack.

Andernfalls, wenn Sie GNU haben findund xargs:

find . -name '*.cc' -print0 -o -name '*.h' -print0 | xargs -0 grep hello /dev/null

Durch die Verwendung von wird /dev/nullsichergestellt, dass Dateinamen gedruckt werden. Das -print0und -0befasst sich mit Dateinamen, die Leerzeichen enthalten (Zeilenumbrüche usw.).

Wenn Sie keine störenden Namen haben (mit Leerzeichen usw.), können Sie Folgendes verwenden:

find . -name '*.*[ch]' -print | xargs grep hello /dev/null

Dies könnte einige Namen aufgreifen, die Sie nicht beabsichtigt haben, da die Musterübereinstimmung unschärfer (aber einfacher) ist, aber ansonsten funktioniert. Und es funktioniert mit Nicht-GNU-Versionen von findund xargs.

Jonathan Leffler
quelle
Beachten Sie, dass Sie auch sagen könnenfind ... -exec grep "hello" {} +
Fedorqui 'SO hör auf zu schaden'
5

Wenn ich Ihre Frage sorgfältig gelesen habe, fragen Sie nach "grep, um das aktuelle Verzeichnis nach allen Dateien zu durchsuchen, die die Zeichenfolge" Hallo "enthalten und nur .h- und .cc-Dateien anzeigen". Um Ihre genauen Anforderungen hier zu erfüllen, ist mein Beitrag:

Dies zeigt die Dateinamen an:

grep -lR hello * | egrep '(cc|h)$'

... und dies zeigt die Dateinamen und Inhalte an:

grep hello `grep -lR hello * | egrep '(cc|h)$'`
Jack
quelle
2
grep -l hello **/*.{h,cc}

Möglicherweise möchten Sie shopt -s nullglobFehlermeldungen vermeiden, wenn keine .h- oder keine .cc-Dateien vorhanden sind.

Glenn Jackman
quelle
4
Ich weiß, wie man Google usw. benutzt. Ich habe es hier gefragt, weil mehrere Antworten "-l" haben und es schön ist, alle Informationen an einem Ort zu haben.
Andrew Swift
-l (Kleinbuchstabe "el") Unterdrückt die normale Ausgabe. Druckt den Namen jeder Eingabedatei, aus der normalerweise die Ausgabe gedruckt worden wäre. Das Scannen / Suchen wird beim ersten Spiel beendet.
Rex CoolCode Charles
-1

Der einfachste Weg: grep -Ril "Dein Text" /

user1733951
quelle
1
Dies zeigt nicht nur .h- oder .cc-Dateien an und es ist nützlich zu erklären, welche Optionen Sie verwendet haben und warum.
Kon Psych