Wie führe ich einen rekursiven directory-Suche nach Zeichenfolgen innerhalb von Dateien in einem UNIX TRU64 Umgebung?
Leider aufgrund der Einschränkungen unserer Tru64 Unix Umfeld bin ich nicht die GREP -r-Schalters zum ausführen meiner Suche nach Zeichenfolgen innerhalb von Dateien über mehrere Verzeichnisse und Unterverzeichnisse.
Im Idealfall würde ich gerne an zwei Parametern. Die ersten werden die Verzeichnis-ich will, dass meine Suche zu beginnen. Die zweite ist eine Datei mit einer Liste aller Zeichenfolgen gesucht werden. Diese Liste wird aus verschiedenen Verzeichnis-Pfad, Namen und Sonderzeichen:
ie:
/aaa/bbb/ccc
/eee/dddd/ggggggg/
etc..
Der Zweck dieser übung ist es, zu identifizieren, alle shell-Skripte, können bestimmte, hart codierten Pfad-Namen identifiziert, der in meiner Liste.
Gab es ein Beispiel, das ich fand während meiner Untersuchungen, die vielleicht nahe kommt, aber ich bin nicht sicher, wie Sie Sie anpassen, diese zu akzeptieren, eine Datei der string-Argumente:
eg: hier finden Sie etb -exec grep test {} \;
wo 'etb' ist das Verzeichnis, und 'test', eine hart codierte Zeichenfolge gesucht werden.
InformationsquelleAutor Evan Bartholomeusz | 2010-11-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies sollte es tun:
find dir -type f -exec grep -F -f strings.txt {} \;
dir
ist das Verzeichnis, von dem aus die Suche beginnenstrings.txt
ist die Datei, die strings übereinstimmen, eine pro Zeile-F
bedeutet behandeln Suchmuster als literal sondern als reguläre Ausdrücke-f strings.txt
bedeutet, dass die Verwendung der Zeichenfolgen instrings.txt
für passendeKönnen Sie hinzufügen
-l
um die grep-Schalter, wenn Sie wollen einfach nur die Dateinamen entsprechen.Fußnote:
Einige Leute bevorzugen eine Lösung mit
xargs
z.B.find dir -type f -print0 | xargs -0 grep -F -f strings.txt
was vielleicht ein wenig mehr robust/effizient, in einigen Fällen.
was macht Sie denken, Sie brauchen
xargs
?brauchen ist ein starkes Wort. Natürlich Sie nicht brauchen es, aber es spart sehr ernst, wie viele Instanzen von einem Programm, das Sie
exec
.klingt wie vorzeitige Optimierung zu mir. 😉
Paul, ich bin nicht sicher, ob die Letzte Nachricht, die ich dir geschickt habe.
InformationsquelleAutor Paul R
Durch Lesen, ich nehme an, wir können nicht die gnu coreutil, und egrep ist nicht verfügbar.
Ich gehe davon aus (aus irgendeinem Grund), das system ist kaputt, und entweicht nicht wie erwartet funktionieren.
Unter normalen Situationen
grep -rf patternfile.txt /some/dir/
ist der Weg zu gehen.Annahmen : gnu coreutil nicht verfügbar. grep -r nicht funktioniert. Handhabung von Sonderzeichen ist gebrochen.
Nun, Sie haben die Arbeit awk ? Nein ?. Es macht das Leben so viel einfacher. Aber seien wir doch auf der sicheren Seite.
Übernehmen : arbeiten
sed
man vonod
ODERhexdump
ODERxxd
(von vim-Paket) zur Verfügung.Nennen diese patternfile.txt
1. Konvertieren Sie die Liste in eine regexp, die grep mag
Beispiel patternfile.txt enthält
(Beispiel nicht-print-special-char, aber es ist da.) wir müssen es in etwas wie
(/foo/|/bar/doe/|/root/)
Vorausgesetzt
echo -en
Befehl ist nicht gebrochen, undxxd
oderod
oderhexdump
verfügbar ist,Mittels hexdump
cat patternfile.txt |hexdump -ve '1/1 "%02x \n"' |tr -d '\n'
Mit od
cat patternfile.txt |od -A none -t x1|tr -d '\n'
und pipe es in (gemeinsam für beide hexdump und od)
|sed 's:[ ]*0a[ ]*$::g'|sed 's: 0a:\\|:g' |sed 's:^[ ]*::g'|sed 's:^: :g' |sed 's: :\\x:g'
leiten Sie das Ergebnis in
|sed 's:^:\\(:g' |sed 's:$:\\):g'
und Sie haben ein regexp-Muster, die ist entkommen.
2. Feed entgangen Muster in gebrochen regexp
Vorausgesetzt, das absolute minimum-shell-escape vorhanden ist,
wir verwenden
grep "$(echo -en "ESCAPED_PATTERN" )"
, unsere Arbeit zu machen.3. Um es zusammenzufassen
Gebäude ein entkommen regexp-pattern (mit hexdump als Beispiel )
entgehen werden alle Zeichen aus und fügen Sie es mit (|) und Klammern so ein regexp-match durchgeführt werden.
4. Recrusive directory lookup
Unter normalen Situationen, auch wenn
grep -r
ist gebrochen,find /dir/-exec grep {} \;
funktionieren sollte.Einige können es vorziehen
xargs
Ausgabe (es sei denn, Sie haben zufällig buggy xargs).Wir bevorzugen
find /somedir/-type f -print0 |xargs -0 grep -f 'patternfile.txt'
Ansatz, aber dadiese Option ist nicht verfügbar (egal aus welchen triftigen Grund),
wir müssen exec
grep
für jede Datei,und das ist normalerweise der falsche Weg.Aber es tun können.
Übernehmen :
find -type f
funktioniert.Übernehmen :
xargs
ist defekt ODER nicht verfügbar.Den ersten, wenn Sie einen buggy Rohr, es könnte nicht mit großen Anzahl von Dateien.
So vermeiden wir
xargs
in solchen Systemen (ich weiß, ich weiß, nur können so tun, es ist defekt ).find /whatever/dir/to/start/looking/-type f > list-of-all-file-to-search-for.txt
WENN Sie Ihre shell mit großen Größe-Listen gut,
for file in cat list-of-all-file-to-search-for.txt ; do grep REGEXP_PATTERN "$file" ;
ist ein schöner Weg, um durch zu bekommen. Unfortunetly, einige Systeme nicht wie, dass,done ;
und in diesem Fall, können Sie verlangen,
cat list-of-all-file-to-search-for.txt | split --help -a 4 -d -l 2000 file-smaller-chunk.part.
um es in kleinere Stücke. Nun das ist für einen ernsthaft kaputtes system.
dann ein
for file in file-smaller-chunk.part.* ; do for single_line in cat "$file" ; do grep REGEXP_PATTERN "$single_line" ; done ; done ;
sollte funktionieren.
A
cat filelist.txt |while read file ; do grep REGEXP_PATTERN $file ; done ;
kann verwendet werden, als workaround, die auf einigen Systemen.
Was ist, wenn mein shell-doe nicht mit zitiert ?
Müssen Sie möglicherweise die Flucht der Datei-Liste, vorher.
Es kann getan werden, viel schöner in
awk
,perl
was auch immer, aber seit wir beschränken uns selbst zused
, es tun können.Wir gehen davon aus
0x27, the ' code
tatsächlich funktioniert.cat list-of-all-file-to-search-for.txt |sed 's@['\'']@'\''\\'\'\''@g'|sed 's:^:'\'':g'|sed 's:$:'\'':g'
Nur die Zeit musste ich nutzen, war dies bei der Fütterung Ausgabe in der bash wieder.
Was ist, wenn meine shell nicht damit umgehen ?
xargs
ausfällt ,grep -r
ausfällt , shell for-Schleife ausfällt.Tun, wir haben andere Dinge ? JA.
Flucht-alle-input geeignet für Ihre shell, und ein Skript.
Aber weißt du was, ich hab board, und das schreiben von automatisierten Skripts für csh scheint nur
falsch. So werde ich hier aufhören.
Hause nehmen Hinweis
Verwenden Sie das Werkzeug für den richtigen job. Schreiben Sie einen interpreter auf
bc
ist perfektfähig, aber es ist schlicht und einfach falsch. Installieren von coreutils,
perl
eine besseregrep
was auch immer. macht das Leben ein besser Ding.
InformationsquelleAutor user497145