it-swarm.com.de

wie verwende ich die Option grep --include für mehrere Dateitypen?

Wenn ich alle HTML-Dateien in einem Verzeichnis grepen möchte, mache ich Folgendes

grep --include="*.html" pattern -R /some/path

was gut funktioniert. Das Problem ist, wie alle HTML-, HTML-, PHP-Dateien in einem Verzeichnis gespeichert werden?

Von diesem Use grep --exclude/- include-Syntax aus, um bestimmte Dateien nicht durchzugehen [], kann ich Folgendes tun

grep --include="*.{html,php,htm}" pattern -R /some/path

Aber leider würde es für mich nicht funktionieren.
Zu Ihrer Information, meine grep-Version ist 2.5.1.

71
tianyapiaozi

Sie können mehrere --include-Flags verwenden. Das funktioniert für mich:

grep -r --include=*.html --include=*.php --include=*.htm "pattern" /some/path/ 

Sie können jedoch die vorgeschlagene Deruijter-Anweisung ausführen. Das funktioniert für mich:

grep -r --include=*.{html,php,htm} "pattern" /some/path/

Vergessen Sie nicht, dass Sie find und xargs für diese Art von Dingen verwenden können, um:

find /some/path/ -name "*.htm*" -or -name "*.php" | xargs grep "pattern"

HTH

101
Steve

Die Verwendung von {html,php,htm} Kann nur als - Klammererweiterung verwendet werden. Dies ist eine nicht standardmäßige (nicht POSIX-konforme) Funktion von bash, ksh und zsh.

  • Mit anderen Worten: Versuchen Sie nicht, es in einem Skript zu verwenden, das auf /bin/sh Abzielt - verwenden Sie in diesem Fall explizit mehrere --include - Argumente.

  • grep selbst versteht not die {...} - Notation.

Damit eine geschweifte Klammer erkannt wird, muss in der Befehlszeile ein ohne Anführungszeichen (Teil eines) Tokens stehen.

Eine geschweifte Klammer-Erweiterung erweitert sich zu mehrere Argumente, sodass im vorliegenden Fall grep mehrere--include=... - Optionen, als hätten Sie sie einzeln übergeben.

Die Ergebnisse einer geschweiften Klammer sind vorbehaltlich Globbing (Dateinamenerweiterung), was Fallstricke hat:

  • Jedes resultierende Argument könnte weiter auf passende Dateinamen erweitert werden, wenn es nicht in Anführungszeichen gesetzt globale Metazeichen wie * Enthält.
    Während dies bei Tokens wie --include=*.html Unwahrscheinlich ist (z. B. müsste eine Datei wörtlich für --include=foo.html Erstellt werden etwas, das zusammenpasst), ist es wert, im Allgemeinen daran zu denken.

  • Wenn die Shell-Option nullglob aktiviert ist (shopt -s nullglob) Und das Verschieben übereinstimmt nichts, wird das Argument verworfen =.

Verwenden Sie daher für eine vollständig robuste Lösung Folgendes:

grep -R '--include=*.'{html,php,htm} pattern /some/path
  • '--include=*.' Wird als wörtlich behandelt, da in Anführungszeichen gesetzt; Dies verhindert eine versehentliche Interpretation von * als glühendes Zeichen.

  • {html,php,htm}, Die - notgedrungen - nicht zitiert Klammererweiterung[1] , erweitert zu 3 Argumenten, die aufgrund von {...} direkt nach dem '...' Token, einschließen das Token.

  • Daher werden nach dem Entfernen von Anführungszeichen durch die Shell das folgende 3 Literal Argumente letztendlich an grep übergeben:

    • --include=*.html
    • --include=*.php
    • --include=*.htm

[1] Genauer gesagt, es müssen nur die syntaxrelevanten Teile der Klammererweiterung nicht in Anführungszeichen gesetzt werden, die Listenelemente dürfen weiterhin einzeln in Anführungszeichen gesetzt werden und müssen wenn sie glühende Metazeichen enthalten, die nach der geschweiften Klammer zu unerwünschten Glühungen führen können; obwohl dies in diesem Fall nicht erforderlich ist, könnte das Obige wie folgt geschrieben werden
'--include=*.'{'html','php','htm'}

22
mklement0

Entfernen Sie die Anführungszeichen

grep --include=*.{html,php,htm} pattern -R /some/path
9
Deruijter

funktioniert das nicht? 

  grep pattern  /some/path/*.{html,php,htm} 
4
Vijay

Versuchen Sie es mit .- r führt eine rekursive Suche aus .-s unterdrückt Fehler, die nicht gefunden werden.

    grep "pattern" <path> -r -s -n --include=*.{c,cpp,C,h}
2
Pradeep

Verwenden Sie grep mit dem Befehl find

find /some/path -name '*.html' -o -name '*.htm' -o -name '*.php' -type f 
 -exec grep PATTERN {} \+

Sie können auch die Optionen -regex und -regextype verwenden.

0

Es funktioniert für den gleichen Zweck, jedoch ohne --include-Option. Es funktioniert auch auf grep 2.5.1.

grep -v -E ".*\.(html|htm|php)"
0
Kohei Mikami