Comment puis-je effectuer un appel récursif de recherche d'annuaire pour des chaînes de caractères dans des fichiers de UNIX TRU64 de l'environnement?
Malheureusement, à cause des limites de notre Unix Tru64 de l'environnement, je suis incapable d'utiliser la commande GREP-r commutateur pour effectuer ma recherche de chaînes de caractères dans les fichiers entre plusieurs répertoires et sous répertoires.
Idéalement, je voudrais passer deux paramètres. Le premier sera le répertoire que je veux faire de ma recherche est de commencer. Le second est un fichier contenant une liste de toutes les chaînes de caractères à rechercher. Cette liste sera composée de différentes chemin d'accès au répertoire de noms et inclure des caractères spéciaux:
ie:
/aaa/bbb/ccc
/eee/dddd/ggggggg/
etc..
Le but de cet exercice est d'identifier tous les scripts shell qui peut avoir de spécifique codé en dur noms de chemin d'accès identifiés dans ma liste.
Il y a un exemple que j'ai trouvé au cours de mes enquêtes, qui vient peut-être proche, mais je ne suis pas sûr de savoir comment personnaliser pour accepter un fichier d'arguments de chaîne:
par exemple: trouver etb -exec grep test {} \;
où " etb "est le répertoire et "test", une codés en dur chaîne à rechercher.
Vous devez vous connecter pour publier un commentaire.
Cela devrait le faire:
find dir -type f -exec grep -F -f strings.txt {} \;
dir
est le répertoire à partir duquel la recherche commencerastrings.txt
est le fichier de chaînes de match, un par ligne,-F
moyens de traiter les chaînes de recherche littérale plutôt que les expressions régulières,-f strings.txt
moyens d'utiliser les chaînes de caractères dans lesstrings.txt
pour la mise en correspondanceVous pouvez ajouter
-l
à la commande grep commutateurs si vous voulez juste les noms qui correspondent.Note de bas de page:
Certaines personnes préfèrent une solution impliquant
xargs
, par exemplefind dir -type f -print0 | xargs -0 grep -F -f strings.txt
qui est peut-être un peu plus robuste/efficace dans certains cas.
xargs
?exec
.-v
drapeau, par exemplefind dir -type f -print0 | xargs -0 grep -F -f strings.txt | grep -v "^#"
Par la lecture, je suppose que nous ne pouvons pas utiliser la gnu coreutil, et egrep n'est pas disponible.
Je suppose (pour certaines raisons), le système est cassé, et s'échappe ne fonctionnent pas comme prévu.
Dans les situations normales,
grep -rf patternfile.txt /some/dir/
est le chemin à parcourir.Hypothèses : gnu coreutil pas disponible. grep -r ne fonctionne pas. la manipulation de caractère spécial est cassé.
Maintenant, vous avez de travail awk ? non ?. Il rend la vie tellement plus facile. Mais laisse être sur le côté sécuritaire.
Assumer : travail
sed
,l'un desod
OUhexdump
OUxxd
(à partir de vim package) est disponible.Permet d'appeler cette patternfile.txt
1. Convertir liste dans une regexp qui grep aime
Exemple patternfile.txt contient
(exemple ne pas imprimer un caractère spécial, mais il est là.) nous devons le transformer en quelque chose comme
(/foo/|/bar/doe/|/root/)
En supposant
echo -en
de commande n'est pas cassé, etxxd
, ouod
, ouhexdump
est disponible,À l'aide de hexdump
cat patternfile.txt |hexdump -ve '1/1 "%02x \n"' |tr -d '\n'
À l'aide od
cat patternfile.txt |od -A none -t x1|tr -d '\n'
et pipe en commun (pour les deux hexdump et od)
|sed 's:[ ]*0a[ ]*$::g'|sed 's: 0a:\\|:g' |sed 's:^[ ]*::g'|sed 's:^: :g' |sed 's: :\\x:g'
alors tuyau de résultat dans
|sed 's:^:\\(:g' |sed 's:$:\\):g'
et vous avez une regexp modèle qui s'est échappé.
2. Nourrir les échappé à motif dans cassée regexp
En supposant que le strict minimum shell escape est disponible,
nous utilisons
grep "$(echo -en "ESCAPED_PATTERN" )"
de faire notre travail.3. Pour résumer
La construction d'un échappé regexp modèle (à l'aide de hexdump à titre d'exemple )
va s'échapper tous les caractères et placez-le (|) supports donc une regexp OU d'un match, sera effectuée.
4. Recrusive recherche dans l'annuaire
Dans les situations normales, même lorsque
grep -r
est cassé,find /dir/-exec grep {} \;
devrait fonctionner.Certains peuvent préférer
xargs
instaed (sauf si vous arrive d'avoir buggy xargs).Nous préférons
find /somedir/-type f -print0 |xargs -0 grep -f 'patternfile.txt'
approche, mais depuisce n'est pas disponible (pour une raison valable),
nous avons besoin de exec
grep
pour chaque fichier,et c'est normalement dans le mauvais sens.Mais permet de le faire.
Assumer :
find -type f
œuvres.Supposons :
xargs
est cassé OU non disponible.Tout d'abord, si vous avez un buggy pipe, il ne peut pas manipuler un grand nombre de fichiers.
Nous avons donc éviter
xargs
dans de tels systèmes (je sais, je sais, seulement vous permet de prétendre qu'il est cassé ).find /whatever/dir/to/start/looking/-type f > list-of-all-file-to-search-for.txt
SI votre shell poignées de grande taille, les listes de bien,
for file in cat list-of-all-file-to-search-for.txt ; do grep REGEXP_PATTERN "$file" ;
est une belle façon de s'en sortir. Unfortunetly, certains systèmes ne sont pas comme ça,done ;
et dans ce cas, vous pouvez avoir besoin
cat list-of-all-file-to-search-for.txt | split --help -a 4 -d -l 2000 file-smaller-chunk.part.
pour le transformer en petits morceaux. Maintenant, c'est pour un brisé système.
puis un
for file in file-smaller-chunk.part.* ; do for single_line in cat "$file" ; do grep REGEXP_PATTERN "$single_line" ; done ; done ;
devrait fonctionner.
Un
cat filelist.txt |while read file ; do grep REGEXP_PATTERN $file ; done ;
peut être utilisé comme solution de contournement sur certains systèmes.
Que faire si mon shell ne sait pas gérer les guillemets ?
Vous pouvez avoir à s'échapper de la liste de fichiers à l'avance.
Il peut être fait beaucoup plus agréable dans
awk
,perl
, que ce soit, mais puisque nous limitons nous-mêmes àsed
, permet de le faire.Nous supposons
0x27, the ' code
sera effectivement le travail.cat list-of-all-file-to-search-for.txt |sed 's@['\'']@'\''\\'\'\''@g'|sed 's:^:'\'':g'|sed 's:$:'\'':g'
La seule fois où j'ai eu à utiliser ce fut lors de l'alimentation de sortie en bash de nouveau.
Que faire si mon shell ne peut pas gérer cela ?
xargs
échoue ,grep -r
échoue , de shell pour la boucle échoue.Faire, nous avons d'autres choses ? OUI.
Échapper à la saisie de tous adaptés à votre shell, et de faire un script.
Mais vous savez quoi, j'ai eu conseil d'administration, et l'écriture de scripts automatisés pour le csh semble juste
mal. Donc je vais m'arrêter ici.
La maison note
L'utilisation de l'outil pour le bon travail. L'écriture d'un interprète sur
bc
est parfaitementcapable, mais il est tout simplement faux. Installer coreutils,
perl
, une meilleuregrep
ce que jamais. rend la vie meilleure chose.