Dateien in Unix finden, die mehrere Strings beinhalten

R

Ray_87

Grünschnabel
Hallo liebe Leute,

ich versuche über die Shell unter Unix alle Dateien ausfindig zu machen, die sowohl den SuchstringA als auch den SuchstringB enthalten. Die gefunden Dateien will ich mir in eine txt-Datei ausgeben lassen.

Dateien zu finden, die nur einen Suchstring enthalten, habe ich schon hinbekommen:
Code:
find /SuchVerzeichnis/ -type f -exec grep -li SuchstringA {} \; >> Ergebnis.txt
("grep -r" geht leider nicht auf dem System)

Ich weiß aber leider nicht wie ich den SuchstringB unter bekommen soll.

Vielen Dank schon mal
 
Wenn sowohl str_a, als auch str_b in einer Zeile enthalten sein sollen, kannst du das über folgende Regular Expression realisieren:
Code:
grep -lie "\(str_a.*str_b\)\|\(str_b.*str_b\)" <file>
Du suchst also nach Zeilen, die entweder der Form
str_a [...] str_b
oder
str_b [...] str_a
entsprechen.

Viele Grüße,
Pik-9
 
("grep -r" geht leider nicht auf dem System)

Falls du mit Solaris arbeitest, kannst du es mal mit
Code:
ggrep -r
versuchen. Und falls das noch nicht installiert ist, mit
Code:
pkg install gnu-grep
nachinstallieren.

Viele Grüße,
Pik-9
 
Vielen Dank schon mal.

Geht aber leider nicht:

Code:
$ find . -type f -exec grep -lie "\(work.*data\)\|\(data.*work\)"  {} \; >> Ergebnis.txt
grep: illegal option -- e
Usage: grep -hblcnsviw pattern file . . .
grep: illegal option -- e
Usage: grep -hblcnsviw pattern file . . .
grep: illegal option -- e
[ . . .]
$ man ggrep
No manual entry for ggrep.
$ ggrep
ksh: ggrep:  not found
$

Ggrep scheint nicht vorhanden zu sein und für Installationen fehlen mir die Rechte.
 
Einfacher, aber inperformanter - weil ein Teil de Dateien 2x verarbeitet wird - ist das hier:

Code:
find /SuchVerzeichnis/ -type f -exec grep --null -li SuchstringA "{}" + \
   | xargs --null grep -li "SuchstringB" >ergebnis.txt

Das --null bei xargs und bei grep sorgen dafür, dass Dateinamen mit einem Nullbyte getrennt werden und nicht mit einem Leerzeichen. Das sollte gewährleisten, dass auch Datein mit Leerzeichen im Namen korrekt verarbeitet werden.

Falls es sich bei SuchStringA/B um festen Text handelt(Im Gegensatz zu variablen Mustern), dann empfehle ich fgrep zu verwenden statt dem normalen grep. Der ist wesentlich schneller.
 
Vielen Dank schon mal.

Geht aber leider nicht:

Code:
$ find . -type f -exec grep -lie "\(work.*data\)\|\(data.*work\)"  {} \; >> Ergebnis.txt
grep: illegal option -- e
Usage: grep -hblcnsviw pattern file . . .
grep: illegal option -- e
Usage: grep -hblcnsviw pattern file . . .
grep: illegal option -- e
[ . . .]
$ man ggrep
No manual entry for ggrep.
$ ggrep
ksh: ggrep:  not found
$

Ggrep scheint nicht vorhanden zu sein und für Installationen fehlen mir die Rechte.

Hi,

versuch doch noch mal:
Code:
/usr/xpg4/bin/grep -RliE '(work.*data)|(data.*work)' <directory>
Wenn das nicht gefunden wird, solltest du noch mal sagen, auf welchem Unix System du dich genau befindest.

Viele Grüße,
Pik-9
 
Zuletzt bearbeitet:
Danke für die Hilfe und Anregung.

Ich habe es mittlerweile mit einem Kollegen so gelöst:
Code:
find /data/archive/ -type f -exec grep -l StringA {} \; > /data/work/CEC/test/ergebnis1 && find /data/archive/ -type f -exec grep -l StringB {} \; > /data/work/CEC/test/ergebnis2 && comm -1 -2 /data/work/CEC/test/ergebnis1 /data/work/CEC/test/ergebnis2 > /data/work/CEC/test/gesamt.txt
Erklärung:
  • Schreibe Dateien mit StringA in Ergenis1;
  • Schreibe Dateien mit StringB in Ergenis2;
  • Vergleiche Ergenis1 und Ergenis2 und schreibe die Gemeinsamkeiten in gesamt.txt

(Da die Zeile aber zu lang ist, habe ich es in ein Skript gepackt)
 
Auf diese Weise wird aber nicht sichergestellt, dass sich work und data in der selben Zeile befinden.
Zum Beispiel die Datei:
Code:
Line 1: work
Line 2: data
Wird so in der Datei gesamt.txt auftauchen. Ist es das was du wolltest?

Viele Grüße,
Pik-9
 
Dass sich StringA und StringB in der selben Zeile befinden war nicht gefordert. Beide Strings muss nur irgendwo in der gleichen Datei auftauchen.

Die gesamt.txt enthält den Pfad von den Dateien wo beide Strings auftauchen.
 

Ähnliche Themen

Verzeichnis mit 1200 Dateien auf Verweise in Textdateien checken

Löschscript mit Logging

Problem mit HSPA+ Modem Huawei E353 - Installation unmöglich?

Windows clients können nicht mehr auf lange laufendes System zugreifen

E-Mail Empfang, Aliases unter Debian Squeeze

Zurück
Oben