renegade51
Goto Top

Dateien in Unix finden, die mehrere Strings beinhalten

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:
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

Content-ID: 347611

Url: https://administrator.de/contentid/347611

Ausgedruckt am: 22.11.2024 um 19:11 Uhr

133883
133883 29.08.2017 aktualisiert um 19:27:14 Uhr
Goto Top
find /Sucherzeichnis/. -type f -regextype posix-extended -iregex '^.*/.*SuchstringA.*SuchstringB.*' >Datei.txt  
oder auch
find /Sucherzeichnis/ -type f | grep '.*/.*SuchstringA.*SuchstringB.*$' >Datei.txt  
Gruß
renegade51
renegade51 29.08.2017 aktualisiert um 19:21:47 Uhr
Goto Top
Danke geht aber leider beides nicht:

$ cat CHG0000542191_find.txt
/data/work/CEC/test/CHGinput.csv
/data/work/CEC/test/CHGinput.txt
/data/work/CEC/test/check_gcm_dec_2016_part1.csv
/data/work/CEC/test/find.txt
/data/work/CEC/test/CHG0000542191_find.txt
$ find . -type f | grep -P '.*/.*(work|dec).*$' >Datei.txt  
grep: illegal option -- P
Usage: grep -hblcnsviw pattern file . . .
$ find . -type f -regextype posix-extended -iregex '^.*/.*(work|dec).*' >Datei.txt  
find: bad option -regextype
find: [-H | -L] path-list predicate-list
$
133883
133883 29.08.2017 aktualisiert um 19:22:45 Uhr
Goto Top
Doch geht beides (getestet)!!, nur kennen wir hier eben dein verwendetes System nicht.
Beim Grep kannst du statt -P auch -E nehmen...
renegade51
renegade51 29.08.2017 um 19:25:52 Uhr
Goto Top
grep: illegal option -- E
Usage: grep -hblcnsviw pattern file . . .

Ich kenne das Sys leider auch nicht so genau. :/
133883
133883 29.08.2017 aktualisiert um 19:28:54 Uhr
Goto Top
Ich kenne das Sys leider auch nicht so genau. :/
Oh man, Koppschüttel ....

Sehe gerade das du eine Und- statt eine Oder-Verknüpfung brauchst dann geht's natürlich so ...
find /Sucherzeichnis/ -type f | grep '.*/.*SuchstringA.*SuchstringB.*$' >Datei.txt  
Lochkartenstanzer
Lösung Lochkartenstanzer 30.08.2017 aktualisiert um 08:11:34 Uhr
Goto Top
Moin,

das ist eigentlich recht trivial, wenn grep die Option -l kennt:

      -l, --files-with-matches
              Suppress  normal output; instead print the name of each input file from which output would 
              normally have been printed.  The scanning will stop on the first match.  (-l is specified by POSIX.)

und xargs vorhanden ist:

find /SuchVerzeichnis/ -type f  | xargs grep -l "SuchStringA" | xargs grep -l "SuchstringB" | xargs grep -l "SuchstringC" | .... | tee Ergebnis-Dateien-mit-allen-Suchstrings.txt

Ansonsten kannst Du auch mit "Backticks" arbeiten, um die Dateinamen aus Ergebnis.txt als Parameter an grep zu übergeben:

grep -l "SuchstringB" `cat ergebnis.txt` >>neues-ergebnis.txt

Alternativ:
grep -l "SuchstringB" $(cat ergebnis.txt) >>neues-ergebnis.txt



lks
renegade51
renegade51 30.08.2017 um 16:59:01 Uhr
Goto Top
Danke für die Hilfe und Anregung.

Ich habe es mittlerweile mit einem Kollegen so gelöst:

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)