Datei nach mehreren Kriterien suchen
Hallo zusammen, wie kann man denn elegant eine Datei nach mehreren Kriterien suchen? Also angenommen, ich möchte alle Dateien finden, die "Bob" und "Alice" enthalten. grep -ril bob /pfad | while read DATEI; do grep -ril alice ${DATEI}; done Aber das muß doch auch noch eleganter gehen, oder? Ein grep -ril bob.*alice geht ja nicht, weil erstens die Reihenfolge nicht sicher ist, und zweitens können die Stichworte ja auch in unterschiedlichen Zeilen stehen. Vielen Dank für Vorschläge! -- Andre Tann -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo Am Samstag, 7. Februar 2009 14:02 schrieb Andre Tann:
Hallo zusammen,
wie kann man denn elegant eine Datei nach mehreren Kriterien suchen? Also angenommen, ich möchte alle Dateien finden, die "Bob" und "Alice" enthalten.
grep -ril bob /pfad | while read DATEI; do grep -ril alice ${DATEI}; done
Aber das muß doch auch noch eleganter gehen, oder? Wie wär's mit 'grep -ril "bob\|alice" /pfad'
Ein
grep -ril bob.*alice geht ja nicht, weil erstens die Reihenfolge nicht sicher ist, und zweitens können die Stichworte ja auch in unterschiedlichen Zeilen stehen.
regular expressions sind deine Freunde
Vielen Dank für Vorschläge!
gerne -- Mit freundlichen Grüßen Matthias Müller (Benutzer #439779 im Linux-Counter http://counter.li.org) PS: Bitte senden Sie als Antwort auf meine E-Mails reine Text-Nachrichten! Siehe auch: http://www.gnu.org/philosophy/no-word-attachments.de.html
Servus Matthias, Matthias Müller, Samstag, 7. Februar 2009 14:55:
Wie wär's mit 'grep -ril "bob\|alice" /pfad'
Heißt soviel wie: bob oder alice in einer Zeile. Was aber, wenn sie in unterschiedlichen Zeilen stehen? Und was, wenn in einer der Zeilen nur bob steht? Das gibt dann auch einen Treffer, obwohl alice nicht vorgekommen ist.
regular expressions sind deine Freunde
Tja, nach genau so einem such ich ja gerade. Aber da der . ja keinen Zeilenumbruch futtert, kann ich nicht nach etwas wie bob.*alice suchen. -- Andre Tann -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo, Am Samstag, 7. Februar 2009 15:03 schrieb Andre Tann:
Servus Matthias,
Matthias Müller, Samstag, 7. Februar 2009 14:55:
Wie wär's mit 'grep -ril "bob\|alice" /pfad'
Heißt soviel wie: bob oder alice in einer Zeile. Was aber, wenn sie in unterschiedlichen Zeilen stehen? Und was, wenn in einer der Zeilen nur bob steht? Das gibt dann auch einen Treffer, obwohl alice nicht vorgekommen ist. Nöö, bei mir hat er in einem kleinen Test folgendes ausgeworfen:
matthias@alien:~$ grep -ril "matthias\|Nein" /home/matthias/testdir /home/matthias/testdir/winprosa.ini matthias@alien:~$ grep -ri "matthias\|Nein" /home/matthias/testdir /home/matthias/testdir/winprosa.ini:Protokoll=Nein /home/matthias/testdir/winprosa.ini:PDV=z:\home\matthias\daten\arbeit\ /home/matthias/testdir/winprosa.ini:ADV=z:\home\matthias\daten\datenbank\ /home/matthias/testdir/winprosa.ini:UPV=z:\home\matthias\updates\ /home/matthias/testdir/winprosa.ini:SAV=3:z:\home\matthias\daten\sicherung\ /home/matthias/testdir/winprosa.ini:WWV=z:\home\matthias\daten\doc\ /home/matthias/testdir/winprosa.ini:ARV=z:\home\matthias\daten\Archiv\ -- Mit freundlichen Grüßen Matthias Müller (Benutzer #439779 im Linux-Counter http://counter.li.org) PS: Bitte senden Sie als Antwort auf meine E-Mails reine Text-Nachrichten! Siehe auch: http://www.gnu.org/philosophy/no-word-attachments.de.html
Am Samstag 07 Februar 2009 14:02:34 schrieb Andre Tann:
Hallo zusammen,
wie kann man denn elegant eine Datei nach mehreren Kriterien suchen? Also angenommen, ich möchte alle Dateien finden, die "Bob" und "Alice" enthalten. grep -ril bob /pfad | while read DATEI; do grep -ril alice ${DATEI}; done
Aber das muß doch auch noch eleganter gehen, oder?
Ein
grep -ril bob.*alice geht ja nicht, weil erstens die Reihenfolge nicht sicher ist, und zweitens können die Stichworte ja auch in unterschiedlichen Zeilen stehen.
Wenn's nicht auf der gelichen zeile vorkommen soll, dann würd' ich awk benutzen: awk ' /Bob/ {a=1;} /Alice/ {b=1;} END {if (a && b) {print "found";}else{print "not found";}} ' < Datei Bye Jürgen -- Dr.rer.nat. Juergen Vollmer, Viktoriastrasse 15, D-76133 Karlsruhe Tel: +49(721) 92 04 87 1 Fax: +49(721) 92 04 87 2 Juergen.Vollmer@informatik-vollmer.de www.informatik-vollmer.de Internet-Telefonie: www.skype.com Benutzer: juergen.vollmer
Servus Jürgen, Dr. Jürgen Vollmer, Samstag, 7. Februar 2009 14:58:
Wenn's nicht auf der gelichen zeile vorkommen soll, dann würd' ich awk benutzen:
Darf, muß aber nicht.
awk ' /Bob/ {a=1;} /Alice/ {b=1;} END {if (a && b) {print "found";}else{print "not found";}} ' < Datei
OK, dieses Konstrukt findet schon mal das richtige heraus. Allerdings weiß ich dann immer noch nicht, in welcher Datei der Fund war. Konkret ist es so, daß ich etwa 200.000 Dateien durchsuchen möchte, und ich denke, es dürfte so 10, 20 Treffer geben. -- Andre Tann -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am Samstag 07 Februar 2009 15:08:04 schrieb Andre Tann:
Servus Jürgen,
Dr. Jürgen Vollmer, Samstag, 7. Februar 2009 14:58:
Wenn's nicht auf der gelichen zeile vorkommen soll, dann würd' ich awk benutzen:
Darf, muß aber nicht.
awk ' /Bob/ {a=1;} /Alice/ {b=1;} END {if (a && b) {print "found";}else{print "not found";}} ' < Datei
OK, dieses Konstrukt findet schon mal das richtige heraus. Allerdings weiß ich dann immer noch nicht, in welcher Datei der Fund war.
for f in `find verzeichnis -print` do awk -v file="$f" ' .,..... END { if (a && b) {print file "found";} else { print file " not found";}} ' done Bye Jürgen -- Dr.rer.nat. Juergen Vollmer, Viktoriastrasse 15, D-76133 Karlsruhe Tel: +49(721) 92 04 87 1 Fax: +49(721) 92 04 87 2 Juergen.Vollmer@informatik-vollmer.de www.informatik-vollmer.de Internet-Telefonie: www.skype.com Benutzer: juergen.vollmer
Dr. Jürgen Vollmer, Samstag, 7. Februar 2009 15:30:
for f in `find verzeichnis -print`
Das funktioniert, aber nicht mit 200k Dateien. Aber dann dürfte das hier gut sein: find /pfad... | while read f; do awk -v file="$f" ' .,..... END { if (a && b) {print file "found";} else { print file " not found";}} ' done Das ist schon mal Anregung genug für mich, damit komme ich weiter. Vielen Dank! -- Andre Tann -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am Samstag 07 Februar 2009 15:43:56 schrieb Andre Tann:
Dr. Jürgen Vollmer, Samstag, 7. Februar 2009 15:30:
for f in `find verzeichnis -print`
Das funktioniert, aber nicht mit 200k Dateien.
warum nicht?
Aber dann dürfte das hier gut sein:
find /pfad... | while read f; do
ist doch das gleiche, ausser man hat Leerzeichen und Zeilenumbrüche im Dateinamen. (Oder hat die for-Schleife eine Obergrenze in der Länge der Argumente?)
awk -v file="$f" ' .,..... END { if (a && b) {print file "found";} else { print file " not found";}} ' done
Das ist schon mal Anregung genug für mich, damit komme ich weiter.
ok wie oft muß die Suche stattfinden? Einmal, dann kann's doch ruhig etwas laufen. Sehr oft? --> dann macht das häufige Starten von AWK natürlich etwas aus. Das lässt sich etwas reduzieren indem man das so benutzt: find .... | xargs awk ... man kann in AWK den Dateinamen der gerade verarbeiteten Datei heraus bekommen. Bye Jürgen -- Dr.rer.nat. Juergen Vollmer, Viktoriastrasse 15, D-76133 Karlsruhe Tel: +49(721) 92 04 87 1 Fax: +49(721) 92 04 87 2 Juergen.Vollmer@informatik-vollmer.de www.informatik-vollmer.de Internet-Telefonie: www.skype.com Benutzer: juergen.vollmer
Dr. Jürgen Vollmer, Samstag, 7. Februar 2009 15:57:
Das funktioniert, aber nicht mit 200k Dateien.
warum nicht?
Das liegt daran, daß `find verzeichnis -print` ersetzt wird mit allen gefundenen Dateien. Die Kommandozeile kann aber IIRC nur 65k Zeichen pro Eingabezeile verarbeiten. Also wird die Eingabezeile zu lang. Aus demselben Grund funktioniert ein rm $(ls -1) nur dann, wenn nicht so viele Dateien aufgelistet werden. Andernfalls braucht man ein ls -1 | xargs rm. -- Andre Tann -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo, Am Sam, 07 Feb 2009, Andre Tann schrieb:
wie kann man denn elegant eine Datei nach mehreren Kriterien suchen? Also angenommen, ich möchte alle Dateien finden, die "Bob" und "Alice" enthalten.
grep -ril bob /pfad | while read DATEI; do grep -ril alice ${DATEI}; done
Aber das muß doch auch noch eleganter gehen, oder?
find /pfad -type f -print0 | xargs -r0 agrep -d'' -s -l 'Alice;Bob' HTH, -dnh -- # Mmm, yesssss. cookies my preciousssss! Mmm, yes downloads it # is! We mustn't have nasty little gmakeses deleting our # precious cookieses now must we? -- gar.lib.mk of 'konstruct' -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
David Haller, Samstag, 7. Februar 2009 16:52:
find /pfad -type f -print0 | xargs -r0 agrep -d'' -s -l 'Alice;Bob'
Als ich sah, daß der Beitrag von Dir kommt, wußte ich: das wird ein Einzeiler... Wie immer: vielen Dank! Wär ich nie drauf gekommen. -- Andre Tann -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
David Haller wrote:
Hallo,
Am Sam, 07 Feb 2009, Andre Tann schrieb:
wie kann man denn elegant eine Datei nach mehreren Kriterien suchen? Also angenommen, ich möchte alle Dateien finden, die "Bob" und "Alice" enthalten.
grep -ril bob /pfad | while read DATEI; do grep -ril alice ${DATEI}; done
Aber das muß doch auch noch eleganter gehen, oder?
find /pfad -type f -print0 | xargs -r0 agrep -d'' -s -l 'Alice;Bob'
HTH, -dnh
Nur zur Information OpenSuse 11.0 ============= agrep (TRE agrep) 0.7.5 Copyright (c) 2002-2006 Ville Laurikari. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Ubuntu 8.04 =========== This is agrep version 3.0, 1994. Der entscheidende Punkt ist aber derjenige, dass dieses Script nur unter Ubuntu (Debian) Distribution das richtige Ergebns liefert. Allgemeingueltig ist dieses Script nicht, auch wenn es ein Einzeiler ist. ES -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo, Am Mon, 09 Feb 2009, Egon Schmid schrieb:
David Haller wrote:
find /pfad -type f -print0 | xargs -r0 agrep -d'' -s -l 'Alice;Bob' [..] Nur zur Information
OpenSuse 11.0 =============
agrep (TRE agrep) 0.7.5
Copyright (c) 2002-2006 Ville Laurikari. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Keine Ahnung was das ist, aber nicht "das" agrep, das ist von "Sun Wu and Udi Manber" und wesentlich älter.
Ubuntu 8.04 ===========
This is agrep version 3.0, 1994.
Die Version hab ich hier auch. Ich hasse es, wenn Leute Programme so nennen wie andere. Achso, bei SuSE 6.2 war agrep (3.0) im 'glimpse' RPM ;) -dnh -- 162: WWW-Benutzer Leute mit den kleinen quadratischen Augen, die beim Zeitunglesen dauernd auf irgendwelche Headlines klicken wollen (Martin Schmitt) -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
participants (5)
-
Andre Tann
-
David Haller
-
Dr. Jürgen Vollmer
-
Egon Schmid
-
Matthias Müller