Grep: 'reguläre ausdrücke' 'logisch UND'

Hallo,
ich will alle Dateien eines Verzeichnisses (find, dann grep) nach
wort1 UND wort2
durchsuchen, aber ich finde keinen Ausdruck. aaargh.
ODER wäre |
grep -E „wort1|wort2“ *
aber UND?
Kriegs auch nicht ergooglet…

J~

Hi,

ich will alle Dateien eines Verzeichnisses (find, dann grep)
nach wort1 UND wort2 durchsuchen

nicht schön, aber funktioniert:

grep -E "foo.\*bar|bar.\*foo" test.txt

Ergibt:

mvh:~ mvh$ cat test.txt 
foo
bar
foobar
barfoo
foo123bar456
123bar456foo

mvh:~ mvh$ grep -E "foo.\*bar|bar.\*foo" test.txt 
foobar
barfoo
foo123bar456
123bar456foo

mvh:~ mvh$ 

Hi Malte, danke erstmal.

analog zu | hoffte ich auch sowas wie &, aber das geht scheinbar nicht :frowning:

grep -E „foo.*bar|bar.*foo“ test.txt

okay… :wink:
gibt bei mir aber zu JEDER Fundstelle in der datei
dateiname:Zeichenkette
aus.

j~@darkstar:~$ grep --v
GNU grep 2.5.3

experimentiere grade mit
grep -il „wort1“ * | xargs grep -il „wort2“
nachdem ich schon DeMorgan anwenden wollte :frowning:
http://www.rechtsmanagement.de/grep.html#Szenario%202

J~

grep -E „foo.*bar|bar.*foo“ test.txt

gibt bei mir aber zu JEDER Fundstelle in der datei
dateiname:Zeichenkette
aus.

Äh, ja. Und? Was willst Du denn stattdessen?

Wenn diese herkömmlichen Lösungen und auch die von Deinem Link nicht das sind, was Du willst, hilft es vielleicht, wenn Du mal eine erwünschte Beispielausgabe angibst :smile:

Gruß,

Malte

Hi,

Äh, ja. Und? Was willst Du denn stattdessen?

OK, mal in ganzen Sätzen: :wink:
Verzeichnis inkl aller Unterverzeichnisse soll nach Dateien durchsucht werden die Wort1 UND Wort2 enthalten, dann den Dateinamen inkl Pfand ausgeben:

soweit bin ich jetzt schon, grep klappt also wies aussieht. Muss nur noch ein
find .
mit verheiratet werden :wink:

j~@darkstar:~$ ls
abc1 cde1
j~@darkstar:~$ cat abc1
abc
abc
j~@darkstar:~$ cat cde1
cde
cde
j~@darkstar:~$ grep -il "c" \* | xargs grep -il "d"
cde1

J~

Hallo J~

Verzeichnis inkl aller Unterverzeichnisse soll nach Dateien
durchsucht werden die Wort1 UND Wort2 enthalten, dann den
Dateinamen inkl Pfand ausgeben:

soweit bin ich jetzt schon, grep klappt also wies aussieht.
Muss nur noch ein
find .
mit verheiratet werden :wink:

Wozu brauchst Du ein find? Sehe ich jetzt nicht ganz ein, der Parameter -r läßt dein grep alle Verzeichnisse unterhalb des momentanen Verzeichnisses rekursiv durchsuchen.

Viele Grüße
Marvin

Hallo J~
Wenn Du tatsächlich nur nach zwei Wörtern gleichzeitig suchen willst, also
wort1 AND wort2
kannst Du das auch ganz einfach durch zwei aufeinanderfolgende grep erschlagen:

grep wort2 \* | grep wort2

das dann noch durch die passenden Optionen ergänzen, also -r -l -i, was immer Du brauchst, und statt * dann eben das passende Dateimuster *.txt, oder *.c, da Du wahrscheinlich nur bestimmte Dateien durchsuchen möchtest.

Viele Grüße
Marvin

Hallo Marvin,

Wenn Du tatsächlich nur nach zwei Wörtern gleichzeitig suchen
willst, also
wort1 AND wort2

ich glaube, es gibt da ein Missverständnis zwischen J~ und dir. Ich denke, J~ möchte alle Dateien, in denen die beiden Wörter irgendwo auftauchen, nicht notwendigerweise beide in einer Zeile. Von daher scheint mir die „grep -l | xargs grep“-Lösung die passende zu sein.

Gruß,
Andreas

Hallo Andreas,

ich glaube, es gibt da ein Missverständnis zwischen J~ und
dir. Ich denke, J~ möchte alle Dateien, in denen die beiden
Wörter irgendwo auftauchen, nicht
notwendigerweise beide in einer Zeile. Von daher scheint mir
die „grep -l | xargs grep“-Lösung die passende zu sein.

Wenn ich mir das nochmal in Ruhe durchlese, hast Du sicher recht. Bin nur etwas irritiert, weil die Suche noch weiterging und auch noch find (warum?) mit einbezogen werden sollte. Aber J~ wird sich sicher bald dazu äußern.

Viele Grüße
Marvin

Hintergründe
Hi,

und auch noch find (warum?) mit einbezogen werden sollte. Aber
J~ wird sich sicher bald dazu äußern.

also wie gesagt suche ich in einem Berg von Dateien in Unterverzeichnissen diejenigen, die zwei (oder mehr) Wörter enthalten.
Da mir ‚reguläre ausdrücke‘ regelmäßig zu komplex werden und ich die eh nur ab und an mal brauche, versuche ich mich auf mir bereits bekanntes zurück zu besinnen. Deshalb verwende ich oft find zum suchen oder auch nur zum (rekursiven) auflisten von Dateien und pipe die Ausgabe dann an grep weiter.
find . | grep wort
finde ich zB praktischer als jedesmal die manpage von find durchzuackern :wink: um dann evtl festzustellen, dass
find . | grep wort1 | grep wort2
schon wieder nur mir ‚regulären Ausdrücken‘ allein mit find umzusetzen ginge und ich dann wieder nach deren Schreibart googlen müsste usw…
Du kannst mir folgen? :wink:

Da mein Hauptproblem war, dass ich nicht mit UND greppen konnte habe ich mich um die Möglichkeit des rekursiven Aufrufs von grep (noch) nicht weiter gekümmert.
Ich bin natürlich trotzdem immer dankbar für bessere Ideen! Ohne deine Erwähnung, dass grep -r kann wüsste ich das immer noch nicht :wink:

Viele Grüße,
J~

Hallo J~,

also wie gesagt suche ich in einem Berg von Dateien in
Unterverzeichnissen diejenigen, die zwei (oder mehr) Wörter
enthalten.

Deshalb verwende ich
oft find zum suchen oder auch nur zum (rekursiven) auflisten
von Dateien und pipe die Ausgabe dann an grep weiter.
find . | grep wort

Du kannst mir folgen? :wink:

Ich denke schon. Du verwendest eben gerne find in dieser einfachen Form und verfeinerst dann die Suche mit anderen Werkzeugen. Naja, warum nicht, viele Wege führen nach Rom, Hauptsache man kommt an.
Aber dein
find . | grep wort
da oben ist jetzt nur ein Beispiel für deine Verwendung von find und nicht für die eigentliche Anfrage, denn die ist ja nun gelöst, denke ich mal.

Viele Grüße,
Marvin