Bash + find + grep

Hallo Linuxianer,

ich habe eine Frage zur Shell-Programmierung.
Ich möchte gerne Verzeichnisse nach bestimmten Dateien durchsuchen. Vielleicht mit .
Diese gefundenen Dateien möchte ich dann nach einem bestimmten Suchstring durchforsten. Vielleicht mit .

Kann ich das irgendwie zusammenbauen mit einer PIPE oder so?

Ein weiteres Problem: Wenn der Suchstring in der Datei gefunden wird, möchte ich nur den Dateinamen ausgeben lassen nicht aber die von „grep“ gefundene Zeile.

Gruß und Danke schon mal Karsten

Hallo Karsten,

mit der Pipe sieht das folgendermaßen aus:

find $pfad -name $name |grep irgendwas

Das gibt alle Zeilen aus, die „irgendwas“ enthalten. Um aus dieser Zeile den Dateinamen zu extrahieren, könnte man AWK verwenden. Damit kann man zum Beispiel nur eine bestimmte Spalte einer Zeile ausgeben. Die genaue Syntax weiß ich leider jetzt nicht auswendig. Am besten mal mit man awk nachsehen. Das ganze müßte dann so _ungefähr_ so aussehen:

find $pfad -name $name |grep irgendwas|awk () {print $2};

wie gesagt: Bei der AWK-Syntax kann ich jetzt gerade nicht nachsehen.

Holger

Hi Karsten

Sorry irgendwie wer ich nicht schlau aus deinen Angaben
Ich kann mir da schon was denken aber bevor ich hier wild ins blaue schreibe konkretisier doch mal die Funktion deines scripts

Du verwendest 4 temp variabeln wann und wie willst du die eingeben ?

Willst du bestimmte ( >1 ) suchbegriffe in Dateinamen finden ??
Ist der Inhalt der Dateien gemeint ?

Phagsae

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

hi,

mit der Pipe sieht das folgendermaßen aus:

find $pfad -name $name |grep irgendwas

Das gibt alle Zeilen aus, die „irgendwas“ enthalten.

in der tat. alle zeilen in der ausgabe von find, die irgendwas enthalten. leider nicht das, was wir wollten…

richtig ist:

find $pfad -name $name -exec grep -l irgendwas {} ; 2>/dev/null

siehe hierzu auch man find, man grep, man bash

joachim

in der tat. alle zeilen in der ausgabe von find, die irgendwas
enthalten. leider nicht das, was wir wollten…

richtig ist:

find $pfad -name $name -exec grep -l irgendwas {} ;
2>/dev/null

siehe hierzu auch man find, man grep, man bash

joachim

OK, hast ja recht! Bin da irgendwie durcheinander gekommen.

Holger

Hallöchen

[snip]

find $pfad -name $name |grep irgendwas|awk () {print $2};

find $pfad -name $name |grep irgendwas|awk -F: ‚{print $2}‘;

wie gesagt: Bei der AWK-Syntax kann ich jetzt gerade nicht
nachsehen.

So sollte das dann mit awk klappen. Bin mir grade nicht sicher, ob der Fieldseperator defaultmässig ein „:“ ist, also hab ich ihn mal mit angegeben.

Grüße
Martin

und als kleines schmankerl:
wenn find sehr viele filnamen liefert (mehr als eine gewoehnliche kommandozeile aufnehmen kann), sollte man nicht mehr mit ‚-exec‘ arbeiten. Hier führt die Lösung dann über ‚xargs‘, also z.B.

find $pfad -type f -name $name | xargs -n 50 grep -l irgendwas 2>/dev/null

bbr

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Ein weiteres Problem: Wenn der Suchstring in der Datei
gefunden wird, möchte ich nur den Dateinamen ausgeben lassen
nicht aber die von „grep“ gefundene Zeile.

Kurz und gut:

aktuelle Version von grep, die rekursiv suchen kann (Parameter -r), dann eingeben:

Path> grep -r * | cut -d „:“ -f1

Oder willst du auch in versteckten Dateien suchen?
Wenn Gross/Kleinschreibung scheissegal ist, dann noch ein ‚i‘ zum Parameter, also: grep -ir *

Li

und als kleines schmankerl:
wenn find sehr viele filnamen liefert (mehr als eine
gewoehnliche kommandozeile aufnehmen kann), sollte man nicht
mehr mit ‚-exec‘ arbeiten.

ich dachte der nachteil von -exec war, dass wir pro fundstelle einen prozess bekommen, was bei grossen mengen teuer werden kann.

die sache mit der zeilenlaenge tritt bei backtick-konstrukten auf:

cat find / -name httpd.conf -print >http.sum

Hier führt die Lösung dann über
‚xargs‘, also z.B.

find $pfad -type f -name $name | xargs -n 50 grep -l irgendwas
2>/dev/null

in der tat schneller. wollte die werte leserschaft aber nicht ueberfordern. ausserdem ist sowas unter root baeh-baeh, da kann man seinen sysop schoen mit aergern, wenn man solche konstrukte ausnutzt…

joachim