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, find
um 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 find
Dateien 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, grep
sondern ein anderer Befehl die eigentliche Ausgabe ( xargs
bzw. find
) erzeugt.
Sie können dies lösen, indem Sie grep
fü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 done
durchläuft die durch angegebenen DateienCOMMAND
, setzt die VariableFILE
auf die aktuelle Datei und führt ausCOMMANDS
.grep foo $FILE
sucht nachfoo
in$FILE
und sendet die Ergebnissedirektzum Bildschirm.unset IFS
setzt den internen Feldtrenner auf seinen Standardwert zurück (in einem Skript nicht erforderlich).
Antwort2
grep
Um 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