www.bimminger.at

Tipps / Linux

Linux

Nach Dateien mit bestimmten Inhalt suchen


Eigentlich wollte ich nur kurz unter Windows die Suchfunktion nutzen und mir alle Text(!)-Dateien anzeigen lassen, die einen bestimmten Text enthalten. Nachdem mir die Suche aber kein Ergebnis lieferte, obwohl ich wußte dass mindestens eine Datei den Wortlaut enthielt, startete ich kurzer Hand Cygwin. Tja, auch ein Windows braucht eine vernünftige Konsole. Nur bis jetzt habe ich auf der Linux-Bash noch nie eine Suche von Dateien mit bestimmtem Inhalt benötigt, also versuchte ich es mit folgender Eingabe:

for i in *.txt; do (cat $i | grep suchtext) && echo "Found:  " $i; done


Zumindest in diesem Augenblick hat mir diese Schleife geholfen die Dateien zu finden und ich konnte meine Arbeit fortsetzen.

Suche nach bestimmten Dateien ohne Schleife mit grep


Natürlich mußte es einfacher gehen, also nahm ich mir später die Zeit um nach einer sinnvolleren Vorgehensweise zu suchen. Folgende Möglichkeiten konnte ich ermitteln:

grep -l -i suchtext *.txt


Das man sich mit grep die Zeilen einer Datei anzeigen lassen kann, die einen bestimmten Inhalt enthalten wußte ich, dass man diesen Ausdruck aber auch über mehrere Dateien laufen lassen kann und sich nur die Dateinamen ausgeben lassen kann, in denen der zu suchende Ausdruck vorkommt, wußte ich bis jetzt nicht. Dafür ist der Parameter -l verantwortlich. Mit -i wird nur die Unterscheidung zwischen Groß- und Kleinschreibung unterbunden. Um aber in allen Dateien und den Unterverzeichnissen Dateien mit einem bestimmten Inhalt zu suchen, reicht oft folgender Ausdruck:

grep -l -i -r suchtext *


Hätte ich mir ja denken können, dass es da eine ganz einfache Lösung gibt ;-) Man muss ja nur hin und wieder man aufrufen ...

Suchmöglichkeiten durch Kombination von grep und find


Genial wird dann die Kombination von grep und find. Damit kann dann auch in bestimmten Dateien nach einem bestimmten Inhalt gesucht werden:

find . -type f -name *.txt -exec grep -l -i suchtext '{}' \;


Wobei hier innerhalb des -exec Parameters die Anweisung '{}' für den aktuellen Dateinamen aus find steht und \; die Anweisung abschließt. Vor \; sollte aber unbedingt ein Leerzeichen stehen, sonst kann schon mal die Fehlermeldung: "find: missing argument to exec" erscheinen.

Natürlich funktionieren diese Vorschläge auch mit regulären Ausdrücken, sofern man statt grep egrep oder zumindest grep mit dem Parameter -E verwendet.


Um einen Diskussionsbeitrag zu posten müssen Sie eingeloggt sein.