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

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

Printed on: April 24, 2024 at 00:04 o'clock

Mitglied: 133883
133883 Aug 29, 2017 updated at 17:27:14 (UTC)
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ß
Member: renegade51
renegade51 Aug 29, 2017 updated at 17:21:47 (UTC)
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
$
Mitglied: 133883
133883 Aug 29, 2017 updated at 17:22:45 (UTC)
Goto Top
Doch geht beides (getestet)!!, nur kennen wir hier eben dein verwendetes System nicht.
Beim Grep kannst du statt -P auch -E nehmen...
Member: renegade51
renegade51 Aug 29, 2017 at 17:25:52 (UTC)
Goto Top
grep: illegal option -- E
Usage: grep -hblcnsviw pattern file . . .

Ich kenne das Sys leider auch nicht so genau. :/
Mitglied: 133883
133883 Aug 29, 2017 updated at 17:28:54 (UTC)
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  
Member: Lochkartenstanzer
Solution Lochkartenstanzer Aug 30, 2017 updated at 06:11:34 (UTC)
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
Member: renegade51
renegade51 Aug 30, 2017 at 14:59:01 (UTC)
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)