linux - with - use grep to find text in file




grep, aber nur bestimmte Dateiendungen (8)

Ich arbeite daran, einige Skripte zu schreiben, um bestimmte Verzeichnisse zu grep , aber diese Verzeichnisse enthalten alle Arten von Dateitypen.

Ich möchte nur .h und .cpp für jetzt grep , aber vielleicht ein paar andere in der Zukunft.

Bisher habe ich:

{ grep -r -i CP_Image ~/path1/;

grep -r -i CP_Image ~/path2/;

grep -r -i CP_Image ~/path3/;

grep -r -i CP_Image ~/path4/;

grep -r -i CP_Image ~/path5/;} 

| mailx -s GREP [email protected]

Kann mir jemand zeigen, wie ich jetzt nur die spezifischen Dateierweiterungen hinzufügen würde?


Da es darum geht , Dateien zu finden, verwenden wir find !

Mit GNU find können Sie die Option -regex , um diese Dateien in der Baumstruktur von Verzeichnissen mit der Erweiterung .h oder .cpp :

find -type f -regex ".*\.\(h\|cpp\)"
#            ^^^^^^^^^^^^^^^^^^^^^^^

Dann ist es nur eine Frage des Ausführens von grep bei jedem seiner Ergebnisse:

find -type f -regex ".*\.\(h\|cpp\)" -exec grep "your pattern" {} +

Wenn Sie diese .h nicht haben, müssen Sie einen Ansatz wie Amir Afghani verwenden und -o um Optionen zu verketten ( der Name endet entweder mit .h oder mit .cpp ):

find -type f \( -name '*.h' -o -name '*.cpp' \) -exec grep "your pattern" {} +
#            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Und wenn Sie grep wirklich verwenden möchten, folgen Sie der angegebenen Syntax - --include :

grep "your pattern" -r --include=*.{cpp,h}
#                      ^^^^^^^^^^^^^^^^^^^

Der einfachste Weg ist

find . -type  f -name '*.extension' | xargs grep -i string 

Es gibt keine Option -r auf HP- und Sun-Servern, so funktionierte das für mich auf meinem HP-Server

find . -name "*.c" | xargs grep -i "my great text"

-i ist für die Suche nach Zeichenfolge ohne Beachtung der Groß- und Kleinschreibung


Ich bin mir bewusst, dass diese Frage etwas veraltet ist, aber ich würde gerne die Methode teilen, die ich normalerweise verwende, um .c und .h Dateien zu finden:

tree -if | grep \\.[ch]\\b | xargs -n 1 grep -H "#include"

oder wenn Sie auch die Zeilennummer benötigen:

tree -if | grep \\.[ch]\\b | xargs -n 1 grep -nH "#include"

Unten ist die Antwort gut.

grep -r -i --include \*.h --include \*.cpp CP_Image ~/path[12345] | mailx -s GREP [email protected]

Aber kann aktualisiert werden auf:

grep -r -i --include \*.{h,cpp} CP_Image ~/path[12345] | mailx -s GREP [email protected]

Was kann einfacher sein.


Verwenden Sie --include Parameter --include wie --include :

grep -r -i --include \*.h --include \*.cpp CP_Image ~/path[12345] | mailx -s GREP [email protected]

das sollte tun was du willst.


ag (der silberne Sucher) hat dafür eine recht einfache Syntax

       -G --file-search-regex PATTERN
          Only search files whose names match PATTERN.

damit

ag -G *.h -G *.cpp CP_Image <path>

grep -rnw "some thing to grep" --include=*.{module,inc,php,js,css,html,htm} ./




grep