grep - Suche nach mehreren Begriffen mit UND verknüpft

Post Reply
Message
Author
Guest

grep - Suche nach mehreren Begriffen mit UND verknüpft

#1 Post by Guest »

Hallo!

Ich suche nach den passenden Befehl, um alle Dateien unter dem akutellen Verzeichnisses nach mehreren Begriffen zu durchsuchen. Die Begriffe müssen alle mit UND verknüpft werden, d.h. es wird nur ein Ergebnis (Dateiname) ausgegeben, wenn Begriff 1 und Begriff 2 und .... gefunden wurden.

Kann mir bitte jemand von Euch weiter helfen ???

Vielen Dank schon mal.

Thomas

kanonenfutter

#2 Post by kanonenfutter »

man egrep

User avatar
jochen
prolinux-forum-admin
Posts: 699
Joined: 14. Jan 2000 15:37
Location: Jülich
Contact:

Ein kleines bisschen shellskripten...

#3 Post by jochen »

Hi,

meinst Du "in allen Dateien im aktuellen Verzeichnis" oder "in allen Dateien rekursiv ab dem aktuellen Verzeichnis"? Das kommt in Deinem Posting nicht ganz durch.

Ansonsten ist "man egrep" m.E. nicht wirklich ausreichend; man kann zwar über "-e" mehrere Regexps angeben, aber die werden geODERt, nicht geUNDet. Ich würd's so machen:

Code: Select all

find . -type f -maxdepth 1 -print0 | xargs -0 grep --null -l 'RE1' | xargs -0 grep --null -l 'RE2' | xargs -0 grep -l 'RE3'
find listet im aktuellen Verzeichnis alle normalen Dateien auf; wenn man -maxdepth weg lässt, arbeitet find rekursiv. Die Dateinamen werden für's erste grep zur Argumentliste aufbereitet (xargs). grep sucht alle Dateien raus, die RE1 als Treffer haben und gibt die Dateinamen weiter, die dann wieder zur Argumentliste für's nächste grep gemacht werden, welches dannn ur noch Dateien weitergibt, in denen auch noch der RE2 auftaucht. Damit Dateien mit problematischen Namen (mit Leerzeichen usw.) nicht stören, werden die Dateinamen alls mit Null-Byte als abschliessendem Zeichen ausgegeben (-print0, -0, --null). Damit man die Ausgabe zuletzt aber schön lesen kann, kässt man beim letzten grep die Option --null weg.

Alle Klarheiten beseitigt? :wink:

Jochen
Die grösste Lüge der EDV? "Mal eben..."

Scory

#4 Post by Scory »

Ich würde ein Miniscript schreiben (was dann die Suchpattern als Argument mitbekommt, hat den Vorteil, daß es einfacher ist die Anzahl Pattern variabel zu halten).

Nennen wir das Script "ff" (file finder), und schreiben diesen Inhalt:

files=`ls` export files #welche Dateien sollen durchsucht werden
for i in $*
do
files=`grep -l $i $files`
done
echo $files

Zum Schluss mit "chmod +x ff" die Datei ausführbar machen, und dann nur noch aufrufen mit:

./ff pattern1 pattern2 pattern3

Viele Wege führen nach Rom ...

jj
Posts: 5
Joined: 03. Dec 2002 12:22

#5 Post by jj »

Mir kommt
  • grep -r RE1 * | grep RE2
am einfachsten vor. Spricht was dagegen?

gruss
jj

User avatar
jochen
prolinux-forum-admin
Posts: 699
Joined: 14. Jan 2000 15:37
Location: Jülich
Contact:

#6 Post by jochen »

@jj: Ja.

Du setzt voraus, dass alle Treffer zusammen in einer Zeile auftreten müssen! Wenn man eine Datei mit Inhalt

ABC
123

hat und nach den REs 'ABC' und '123' sucht, die zusammen in einer Datei auftreten sollen, würde mit Deinem Skript die obige Datei durchfallen...

Jochen
Die grösste Lüge der EDV? "Mal eben..."

prospero_p

geht doch

#7 Post by prospero_p »

nunja grep -r RE1 * | grep RE2 das geht nicht,
aber:
grep -r -l RE1 * |xargs grep -l RE2

gruss prospero

User avatar
jochen
prolinux-forum-admin
Posts: 699
Joined: 14. Jan 2000 15:37
Location: Jülich
Contact:

#8 Post by jochen »

Exakt. Und das entspricht dem Prinzip meiner Lösung. :wink:

Jochen
Die grösste Lüge der EDV? "Mal eben..."

Post Reply