Hallo Liste, ich möchte aus allen (Text)Dateien unter einem bestimmten Verzeichnis diese finden in denen der String ^Mw und ^dL enthalten ist. Die Strings stehen in kleiner Beziehung zu einander und ^ ist nicht eine regex sondern Teil des Strings. Nun damit bekomme ich zumindest alle Dateien mit ^Mw aber wie pipe ich in ein zweites grep? Oder kann ich beim grep irgendwie und Verküpfen. Nun und -type f wählt einbischen zu viel aus wie schränke ich auf Textdateien ein? find ~/data/ -type f -exec grep -l \\^Mw {} \; Schon mal vielen vielen Dank Michael -- Encrypted eMail welcome! Get my OpenPGP-Key ID: 0xE9B00731 from: wwwkeys.de.pgp.net
Hallo Michael, On Mon, Jun 09, 2003 at 11:33:08AM +0200, Michael Hoeller wrote:
ich möchte aus allen (Text)Dateien unter einem bestimmten Verzeichnis diese finden in denen der String ^Mw und ^dL enthalten ist. Die Strings stehen in kleiner Beziehung zu einander und ^ ist nicht eine regex sondern Teil des Strings.
Nun damit bekomme ich zumindest alle Dateien mit ^Mw aber wie pipe ich in ein zweites grep? Oder kann ich beim grep irgendwie und Verküpfen. Nun und -type f wählt einbischen zu viel aus wie schränke ich auf Textdateien ein?
find ~/data/ -type f -exec grep -l \\^Mw {} \;
find ~/data/ -name "*.txt" -type f -exec awk '/(\^Mw|\^dL)/ \ {printf "%s\n",$0}' {} \; -print Gibt Dir eine Liste der Dateien aus mit der jeweiligen Stelle des regex Ausdrucks. Ich glaube egrep sollte das auch können. (Viel mir gerade ein :) Greetings Daniel -- Fighting for peace is like fucking for virginity!
Hallo Daniel, Daniel Lord wrote:
ich möchte aus allen (Text)Dateien unter einem bestimmten Verzeichnis diese finden in denen der String ^Mw und ^dL enthalten ist. Die Strings stehen in kleiner Beziehung zu einander und ^ ist nicht eine regex sondern Teil des Strings.
find ~/data/ -name "*.txt" -type f -exec awk '/(\^Mw|\^dL)/ \ {printf "%s\n",$0}' {} \; -print
DAS ist fast die Lösung nur werden hier alle Vorkommen von \^Mw _oder_ \^dL angedruckt. Ich suche nur die Dateinen wo _beides_ vorkommt. Kann man das auch mit awk? Michael -- Encrypted eMail welcome! Get my OpenPGP-Key ID: 0xE9B00731 from: wwwkeys.de.pgp.net
* Michael Hoeller schrieb am 09.Jun.2003:
Nun und -type f wählt einbischen zu viel aus wie schränke ich auf Textdateien ein?
Was genau ist eine Textdatei? Wie soll find das herausfinden? Abgesehen davon, daß es Abgrenzungsschwierigkeiten gibt [1], müßte find ja jede Datei aufmachen und kontrollieren ob es eine Textdatei ist. Bei einem -type f wird einfach in der Inode geschaut, da steht der Typ drin. Da gibt es aber lediglich Verzeichnisse, symLinks, namedPipes, block- und zeichenorientierte Gerätedateien, Sockets sowie normale Dateien. [1] Ürsprünglich war eine Textdatei, eine Datei, die nicht leer war und nur ASCII-Zeichen drin vorkamen. Aber dann dürften keine Umlaute vorkommen. Was aber ist mit éèê usw? Wenn man zuviel zuläst, ist nachher alles eine Textdatei. PS: Bist Du Dir sicher, daß da wirklich ^M also ^ gefolgt von einem M steht und nicht etwa was ein einziges Zeichen ist und für Carriage Return steht. Hat man gerne bei Dateien, die auf Windows geschrieben wurden. Allerdings macht mich Dein ^d stutzig. Bernd -- Bitte die Etikette beachten: http://www.suse-etikette.de.vu/etikette.html Bitte Realnamen angeben, kein Vollquoting, kein Html, PGP oder Visitenkarten benutzen. Signatur mit "-- " abtrennen, bei Antworten "Re: " voranstellen, sonst nichts. |Zufallssignatur 4
* Bernd Brodesser textete am 09.06.03:
* Michael Hoeller schrieb am 09.Jun.2003:
Nun und -type f wählt einbischen zu viel aus wie schränke ich auf Textdateien ein?
Was genau ist eine Textdatei? Wie soll find das herausfinden? Abgesehen davon, daß es Abgrenzungsschwierigkeiten gibt [1], müßte find ja jede Datei aufmachen und kontrollieren ob es eine Textdatei ist. Bei einem -type f wird einfach in der Inode geschaut, da steht der Typ drin. Da gibt es aber lediglich Verzeichnisse, symLinks, namedPipes, block- und zeichenorientierte Gerätedateien, Sockets sowie normale Dateien.
[1] Ürsprünglich war eine Textdatei, eine Datei, die nicht leer war und nur ASCII-Zeichen drin vorkamen. Aber dann dürften keine Umlaute vorkommen. Was aber ist mit éèê usw? Wenn man zuviel zuläst, ist nachher alles eine Textdatei.
Und wenn man irgendwas mit file bastelt? Oh, ich seh grad... florian@grossing:~> file temp.txt temp.txt: ASCII text, with very long lines Muß mich doch mal genauer mit file beschäftigen. cu flo -- Aber mal im Ernst´. Ich verstehe gar nicht was die anderen wollen. Die meisten Gruppen sind doch noch viel dämlicher als wie dag°. Ich glaube die merken das gar nicht mehr. [WoKo in dag°]
* Florian Gross schrieb am 09.Jun.2003:
Und wenn man irgendwas mit file bastelt?
Oh, ich seh grad...
florian@grossing:~> file temp.txt temp.txt: ASCII text, with very long lines
Muß mich doch mal genauer mit file beschäftigen.
Wollte ich auch noch erwähnt haben. Allerdings muß man die Ausgabe analysieren. Zum Beispiel, ob da irgendwo text auftaucht. Binärdateien haben meist das Schlüsselwort data. Allerdings kann es in die Hose gehen. So hatte file lange Zeit Probleme mit Texten die Umlaute enthielten. File untersucht nur die ersten paar Byte. Ist wohl ein guter Kompromis. Bernd -- ACK = ACKnowledge = Zustimmung | NAC = No ACknowledge = keine Zustimmung DAU = Dümmster Anzunehmender User | LOL = Laughing Out Loud = Lautes Lachen IIRC = If I Remember Correctly = Falls ich mich richtig erinnere OT = Off Topic = Am Thema (der Liste) vorbei |Zufallssignatur 11
Am Montag, 9. Juni 2003 11:33 schrieb Michael Hoeller:
Hallo Liste,
ich möchte aus allen (Text)Dateien unter einem bestimmten Verzeichnis diese finden in denen der String ^Mw und ^dL enthalten ist. Die Strings stehen in kleiner Beziehung zu einander und ^ ist nicht eine regex sondern Teil des Strings.
Nun damit bekomme ich zumindest alle Dateien mit ^Mw aber wie pipe ich in ein zweites grep? Oder kann ich beim grep irgendwie und Verküpfen. Nun und -type f wählt einbischen zu viel aus wie schränke ich auf Textdateien ein?
find ~/data/ -type f -exec grep -l \\^Mw {} \;
grep -r "\\^Mw" | grep "\\^dL" Gruß Heiner -- Heiner Kuhlmann Unter den Eichen 30, D-28857 Syke, Germany Phone: +49(4240)95076 FAX +49(4240)95077 PM: heiner.kuhlmann@t-online.de Liste: linux@kr-k.de
Hallo Heiner, Heiner Kuhlmann wrote:
find ~/data/ -type f -exec grep -l \\^Mw {} \;
grep -r "\\^Mw" | grep "\\^dL"
an so was habe ich gedacht aber leider habe ich noch nicht raus wie ich das in ein exec bekomme, -- Encrypted eMail welcome! Get my OpenPGP-Key ID: 0xE9B00731 from: wwwkeys.de.pgp.net
Am Montag, 9. Juni 2003 19:07 schrieb Michael Hoeller:
Hallo Heiner,
Heiner Kuhlmann wrote:
find ~/data/ -type f -exec grep -l \\^Mw {} \;
grep -r "\\^Mw" | grep "\\^dL"
an so was habe ich gedacht aber leider habe ich noch nicht raus wie ich das in ein exec bekomme,
Du brauchst keinen find. man grep: -R, -r, --recursive Read all files under each directory, recursively; this is equivalent to the -d recurse option. Gruß Heiner -- Heiner Kuhlmann Unter den Eichen 30, D-28857 Syke, Germany Phone: +49(4240)95076 FAX +49(4240)95077 PM: heiner.kuhlmann@t-online.de Liste: linux@kr-k.de
Hallo, On Mon, 09 Jun 2003, Michael Hoeller wrote:
Heiner Kuhlmann wrote:
find ~/data/ -type f -exec grep -l \\^Mw {} \;
grep -r "\\^Mw" | grep "\\^dL"
an so was habe ich gedacht aber leider habe ich noch nicht raus wie ich das in ein exec bekomme,
Aeh, wie waere es, wenn du mal auch selbst in die manpages schaust? find ~/data/ -type f -print0 | xargs -0 grep -l '\^Mw.*\^dL\|\^dL.*\^Mw' -dnh -- Merke: Wenn eine Frage nicht mit 42 beantwortet werden kann, ist die Frage ungültig. [Christopher Splinter in dag°]
On Mon, 09 Jun 2003 at 20:00 (+0200), David Haller wrote:
Hallo,
On Mon, 09 Jun 2003, Michael Hoeller wrote:
Heiner Kuhlmann wrote:
find ~/data/ -type f -exec grep -l \\^Mw {} \;
grep -r "\\^Mw" | grep "\\^dL"
an so was habe ich gedacht aber leider habe ich noch nicht raus wie ich das in ein exec bekomme,
Aeh, wie waere es, wenn du mal auch selbst in die manpages schaust?
find ~/data/ -type f -print0 | xargs -0 grep -l '\^Mw.*\^dL\|\^dL.*\^Mw'
Das löst aber IMHO das Problem immer noch nicht: Es wird ja nach wie vor nur das Auftauchen beider Suchmuster in _einer_ Zeile erkannt. Wenn ich die Frage richtig interpretiert habe, ist ja genau das nicht zwingend der Fall. Sie müssen nur in der selben Datei auftreten. Dann sollte aber die Lösung aus meiner anderen Mail helfen. Jan
Hallo, On Tue, 10 Jun 2003, Jan Trippler wrote:
On Mon, 09 Jun 2003 at 20:00 (+0200), David Haller wrote:
On Mon, 09 Jun 2003, Michael Hoeller wrote:
Heiner Kuhlmann wrote:
find ~/data/ -type f -exec grep -l \\^Mw {} \;
grep -r "\\^Mw" | grep "\\^dL"
an so was habe ich gedacht aber leider habe ich noch nicht raus wie ich das in ein exec bekomme,
Aeh, wie waere es, wenn du mal auch selbst in die manpages schaust?
find ~/data/ -type f -print0 | xargs -0 grep -l '\^Mw.*\^dL\|\^dL.*\^Mw'
Das löst aber IMHO das Problem immer noch nicht: Es wird ja nach wie vor nur das Auftauchen beider Suchmuster in _einer_ Zeile erkannt.
Ja, das hatte der OP bis dahin noch nicht verraten.
Dann sollte aber die Lösung aus meiner anderen Mail helfen.
Fast. Du hast im zweiten grep ein '\' zuviel (grep \-l??) ;) -dnh -- Das Leben ist ein Rollenspiel, in dem man den Endgegner niemals besiegen kann. [WoKo in dag°]
On Die, 10 Jun 2003 at 02:33 (+0200), David Haller wrote:
On Tue, 10 Jun 2003, Jan Trippler wrote:
On Mon, 09 Jun 2003 at 20:00 (+0200), David Haller wrote:
[...]
find ~/data/ -type f -print0 | xargs -0 grep -l '\^Mw.*\^dL\|\^dL.*\^Mw'
Das löst aber IMHO das Problem immer noch nicht: Es wird ja nach wie vor nur das Auftauchen beider Suchmuster in _einer_ Zeile erkannt.
Ja, das hatte der OP bis dahin noch nicht verraten.
Doch, irgendwo im Thread kam der Hinweis - sonst wäre ich auch nicht auf den Trichter gekommen.
Dann sollte aber die Lösung aus meiner anderen Mail helfen.
Fast. Du hast im zweiten grep ein '\' zuviel (grep \-l??) ;)
Sch... Copy & Paste ;-) Jan
Heiner Kuhlmann wrote:
ich möchte die Dateien findenn in denen der String ^Mw und ^dL enthalten ist
grep -r "\\^Mw" . | grep "\\^dL"
Hallo Heiner, vielen Dank für die Antwort. Den Umweg über find hatte ich versucht weil die zusuchenden Strings zwar in einer Datei nicht aber in einer Zeile stehen. Der o.g. Ausdruck liefert nur Treffer wenn in einer _Zeile_ beide Strings stehen. Ich suche etwas zweistufiges: Alle Dateien finden in denen String1 vorkommt diese in einen zweiten Suchlauf stecken der String2 sucht (wieder von Anfang der Datei). Viele Grüsse Michael -- Encrypted eMail welcome! Get my OpenPGP-Key ID: 0xE9B00731 from: wwwkeys.de.pgp.net
On Mon, 09 Jun 2003 at 20:36 (+0200), Michael Hoeller wrote:
Heiner Kuhlmann wrote:
ich möchte die Dateien findenn in denen der String ^Mw und ^dL enthalten ist
grep -r "\\^Mw" . | grep "\\^dL"
vielen Dank für die Antwort. Den Umweg über find hatte ich versucht weil die zusuchenden Strings zwar in einer Datei nicht aber in einer Zeile stehen. Der o.g. Ausdruck liefert nur Treffer wenn in einer _Zeile_ beide Strings stehen. Ich suche etwas zweistufiges: Alle Dateien finden in denen String1 vorkommt diese in einen zweiten Suchlauf stecken der String2 sucht (wieder von Anfang der Datei).
find . -type f -exec grep \-l "\\^Mw" {} \; | xargs grep \-l "\\^dL" sollte die erwünschte Dateiliste liefern. Jan
*** Michael Hoeller (MichaelHoeller@t-online.de) schrieb heute in suse-linux:
[...] ich möchte aus allen (Text)Dateien unter einem bestimmten Verzeichnis diese finden in denen der String ^Mw und ^dL enthalten ist. Die Strings stehen in kleiner Beziehung zu einander und ^ ist nicht eine regex sondern Teil des Strings.
Das wäre mal wieder ein Fall für RTFM gewesen: Sowohl find <search-root-dir> -type f -exec egrep -li '\^(Mw|dL)' {} \; als auch find <search-root-dir> -type f \( -exec fgrep -li '^Mw' {} \; -o \ -exec fgrep -li '^dL' {} \; \) hätten funktioniert. MfG Henning Hucke -- "Kooperation und Ruecksichtnahme ist Schwaeche", sagte der Topmanager, "Macher" und Erfolgsmensch, als er die letzten frei lebenden Paradies- voegel im Zuge der Rodungsarbeiten fuer seine neue Billiglohnfabrik in der dritten Welt toeten lies. (c) H.Hucke
On Mon, 09 Jun 2003 at 19:42 (+0200), Henning Hucke wrote:
*** Michael Hoeller (MichaelHoeller@t-online.de) schrieb heute in suse-linux:
[...] ich möchte aus allen (Text)Dateien unter einem bestimmten Verzeichnis diese finden in denen der String ^Mw und ^dL enthalten ist. Die Strings stehen in kleiner Beziehung zu einander und ^ ist nicht eine regex sondern Teil des Strings.
Das wäre mal wieder ein Fall für RTFM gewesen: Sowohl
Ach Henning, warum immer diese Spitzen? Die Frage ist ja nun nicht soo trivial - immerhin hast Du ja auch ne Niete gezogen ;-) Eine Man-Page zu lesen bedeutet doch nicht automatisch, auch komplexere Zusammenhänge mal so eben daraus ableiten zu können. Wenn das jeder könnte, bräuchten wir diese Liste nicht. Das Ausnutzen der Möglichkeiten der Shell oder von Kommandos wie grep, find und Co. muss man lernen, nicht jeder hat das mit der Muttermilch eingesogen.
find <search-root-dir> -type f -exec egrep -li '\^(Mw|dL)' {} \;
findet Dateien, in denen das erste _oder_ das zweite Suchmuster auftreten. Gesucht war _und_
als auch
find <search-root-dir> -type f \( -exec fgrep -li '^Mw' {} \; -o \ -exec fgrep -li '^dL' {} \; \)
Dito.
hätten funktioniert.
Nö. Jan
Michael: An Dich per bcc, damit Du die Lösung auf jeden Fall bekommst. Das nächstemal bitte die Frage eindeutiger formulieren. *** Jan Trippler (Jan.Trippler@t-online.de) schrieb heute in suse-linux:
[... eine ganze Menge, was hier wieder nur eine OT-Diskussion lostreten würde ...]
Die - in der Tat nicht triviale - Lösung des Problems, für die ich in der Tat auch etwa eine halbe Stunde gebraucht habe: find tmp/ -type f -exec fgrep -iq '^Mw' {} \; -exec \ fgrep -iq '^dL' {} \; -printf 'test "`file -b %p`" = "ASCII text" \ && echo "%p"\n' | sh -s Um das ganze ein wenig Fehlertoleranter zu gestalten, kann man auch bei file zusätzlich mit "-i" und beim Vergleich mit pattern matching arbei- ten. Sowieso dürften Variationen zur Anpassung an die eigenen Bedürf- nisse nötig sein. MfG Henning Hucke -- Stellt euch vor, deutsche wuerden alle Arbeitsplaetze annehmen, die deutsche Unternehmen in Ausland aufbauen, nachdem sie in Deutschland abgebaut worden sind... Ein Land ohne Volk. (c) Hucke
On Die, 10 Jun 2003 at 12:02 (+0200), Henning Hucke wrote: [...]
find tmp/ -type f -exec fgrep -iq '^Mw' {} \; -exec \ fgrep -iq '^dL' {} \; -printf 'test "`file -b %p`" = "ASCII text" \ && echo "%p"\n' | sh -s
Um das ganze ein wenig Fehlertoleranter zu gestalten, kann man auch bei file zusätzlich mit "-i" und beim Vergleich mit pattern matching arbei- ten. Sowieso dürften Variationen zur Anpassung an die eigenen Bedürf- nisse nötig sein.
Schöne Sache das - kommt in mein Archiv. Allerdings würde ich die Option -i im fgrep weglassen. So wie die Suchmuster aussehen, ist IMHO die Groß-Kleinschreibung wichtig (aber das sollte der OP selbst beurteilen können). Jan
participants (8)
-
B.Brodesser@t-online.de
-
Daniel Lord
-
David Haller
-
Florian Gross
-
Heiner Kuhlmann
-
Henning Hucke
-
Jan.Trippler@t-online.de
-
MichaelHoeller@t-online.de