Wie kann ich die Übereinstimmungshervorhebung von grep beibehalten, wenn ich „find“ an grep weiterleite?

Wie kann ich die Übereinstimmungshervorhebung von grep beibehalten, wenn ich „find“ an grep weiterleite?

Wenn ich ausführe grep foo bar.txt, hebt grep jedes Vorkommen von „foo“ in hervor bar.txt. Manchmal möchte ich aber auch verwenden, findum zu bestimmen, welche Dateien grep durchsucht. Also mache ich so etwas:

find . -iname "*.abc" | xargs grep foo

Oder dieses:

find . -iname "*.abc" -exec grep foo {} \;

In beiden Fällen findet grep Vorkommen von „foo“ in den angegebenen Dateien korrekt, die Ausgabe weist jedoch keinerlei Hervorhebungen auf.

Wie kann ich weiterhin findDateien für die Suche mit Grep auswählen, ohne die Hervorhebung zu verlieren?

Ich verwende Gnome Terminal 3.4.1.1 auf Ubuntu 12.04 mit Bash als Shell.

Antwort1

Bei beiden Befehlen besteht das Problem darin, dass nicht, grepsondern ein anderer Befehl die eigentliche Ausgabe ( xargsbzw. find) erzeugt.

Sie können dies lösen, indem Sie grepfür jeden Dateinamen direkt Folgendes aufrufen:

IFS=$'\n'
for FILE in $(find . -iname "*.abc"); do
    grep foo $FILE
done
unset IFS

Oder als Einzeiler:

IFS=$'\n';for FILE in $(find . -iname "*.abc");do grep foo $FILE;done;unset IFS

Wie es funktioniert:

  • IFS=$'\n'Setzt den internen Feldtrenner auf das Zeilenumbruchzeichen (andernfalls verursachen Leerzeichen in Dateinamen Probleme).

  • for FILE in $(COMMAND); do COMMANDS donedurchläuft die durch angegebenen Dateien COMMAND, setzt die Variable FILEauf die aktuelle Datei und führt aus COMMANDS.

  • grep foo $FILEsucht nach fooin $FILEund sendet die Ergebnissedirektzum Bildschirm.

  • unset IFSsetzt den internen Feldtrenner auf seinen Standardwert zurück (in einem Skript nicht erforderlich).

Antwort2

grepUm Ihre Ausgabe einzufärben, wiederholen Sie einfach Ihre Eingabe.

Ich habe hier etwas Ähnliches gemacht:Holen Sie sich zusätzliche Daten rund um das Match von grep

verwandte Informationen