Christoph Zurnieden: Unix Kommando um Dateien nach bestimmter Zeile zu durchsuchen

Beitrag lesen

Hi,

Na? Wieder zurück im Trott?
Bist Du so braun geworden oder ist das Rost?

Ja, is' ja schon gut, ich hör' ja schon auf.

Wenn mehr als nur eine Handvoll Dateien durchsucht werden sollen wäre
'find' zu empfehlen:

Ja, aber…

Ja, das gibt's natürlich viele "aber" ;-)

find /verzeichnis/in/dem/gesucht/werden/soll -type f -exec grep -q Suchbegriff {} ; -print

… nicht so!

Ist die einfachste Möglichkeit, da wir hier einen Anfänger vor uns haben. Ich nehme hier zumindest einen Anfänger an, da 'grep' nun wirklich zum Grundwissen gehört.
Der Overhead des Prozeßspawnings ist auch nicht so groß, das er nur bei wirklich schnellen Platten oder sehr kleinen Dateien und großen Plattencache merklich in's Gewicht fallen würde.
Aber das kann man ja aml ausprobieren. Bei mir werkelt relativ lahmes Geraffel mit 'nem Duron-1200 und 'nem halbem GiB RAM. Testbed ist, wie kann es anders sein: SELFHTML-8.1.

$ time find ./selfhtml81 -type f -exec grep -q DOCTYPE {} ; -print > /dev/null
real    0m18.798s
user    0m5.180s
sys     0m5.090s

sync && hdparm -f /dev/hda

$ find ~/misc-docs >/dev/null # clear caches "brute force"
$ time find ./selfhtml81 -type f -print | xargs grep -lZ -H DOCTYPE | tr '\0' '\n' > /dev/null
real    0m1.694s
user    0m0.100s
sys     0m0.210s

Ja gut, hast ja Recht!
;-)

Damit wird für jede Datei ein neues grep gestartet, völlig
unnötigerweise! So macht man es besser:

find . -type f -print0 | xargs -0 grep -lZ -H "pattern" | sed 's!\0.*$!!'

Damit werden genau vier Prozesse gestartet: find, xargs, grep und sed

Naja, wenn's nur darum ginge würde ich eh Perl anschmeißen, das wäre dann nur ein einziger Prozeß bzw so viele/wenige, wie man bestimmt. Zudem müßte ich bei Deinem Vorschlag mindestens in die Manpage von 'xargs' schauen, da ich das zu selten nutze. Und da ich eine ausgesprochen faule Sau bin ... ;-)

Das mit sed funktioniert bei mir übrigens gar nicht (Version 3.02), die mag keine \x00, auf welche Weise auch immer; ob nun geflüchtet, dezimal, hexadezimal oder octal: alles scheißegal, nix will sie.

so short

Christoph Zurnieden