trouver une chaîne dans un fichier compressé dans un dossier
Mon problème actuel est que j'ai environ 10 dossiers, qui contiennent des fichiers gzippés (environ en moyenne 5 chacun). Cela en fait 50 fichiers à ouvrir et à regarder.
Existe-t-il une méthode plus simple pour savoir si un fichier gzippé dans un dossier a un motif particulier ou non?
zcat ABC/myzippedfile1.txt.gz | grep "pattern match"
zcat ABC/myzippedfile2.txt.gz | grep "pattern match"
" au Lieu d'écrire un script, puis-je faire la même chose en une seule ligne, pour tous les dossiers et sous-dossiers?
for f in `ls *.gz`; do echo $f; zcat $f | grep <pattern>; done;
7 réponses
Zgrep va regarder dans les fichiers gzippés, a une option récursive-R, et a-h me montrer l'option de nom de fichier:
zgrep -R --include=*.gz -H "pattern match" .
Vous n'avez pas besoin de zcat ici, car il est de zgrep et zegrep.
Si vous voulez exécuter une commande sur une hiérarchie de répertoire, vous utilisez trouver:
find . -name "*.gz" -exec zgrep ⟨pattern⟩ \{\} \;
" Et aussi "ls *.gz
" est inutile dans le pour et vous devriez utiliser "*.gz" dans le futur.
Utilisez la commande find
find . -name "*.gz" -exec zcat "{}" + |grep "test"
Ou essayez d'utiliser l'option récursive (- r) de zcat
Comment zgrep ne supporte pas-R
Je pense que la solution de "Nietzche-jou" pourrait être une meilleure réponse, mais j'ajouterais l'option-H pour montrer le nom de fichier quelque chose comme ceci
find . -name "*.gz" -exec zgrep -H 'PATTERN' \{\} \;
Venant un peu en retard sur cela, a eu un problème similaire et a pu résoudre en utilisant;
zcat -r /some/dir/here | grep "blah"
, Comme détaillé ici;
Http://manpages.ubuntu.com/manpages/quantal/man1/gzip.1.html
Cependant, cela ne montre pas le fichier d'origine à partir duquel le résultat correspond, mais affiche "(entrée standard)" car il provient d'un tuyau. zcat ne semble pas non plus prendre en charge la sortie d'un nom.
En termes de performance, c'est ce que nous avons;
$ alias dropcache="sync && echo 3 > /proc/sys/vm/drop_caches"
$ find 09/01 | wc -l
4208
$ du -chs 09/01
24M
$ dropcache; time zcat -r 09/01 > /dev/null
real 0m3.561s
$ dropcache; time find 09/01 -iname '*.txt.gz' -exec zcat '{}' \; > /dev/null
0m38.041s
Comme vous pouvez voir que l'utilisation de la méthode find|zcat
est significativement plus lente que l'utilisation de zcat -r
lorsque vous traitez même un petit volume de fichiers. J'ai également été incapable de faire sortir zcat le nom de fichier (en utilisant -v
affichera apparemment le nom de fichier, mais pas sur chaque ligne). Il semblerait qu'il n'y ait pas actuellement d'outil qui fournira à la fois la cohérence de la vitesse et du nom avec grep (c'est-à-dire l'option -H
).
Si vous devez identifier le nom du fichier auquel appartient le résultat, vous devez écrivez votre propre outil (peut être fait en 50 lignes de code Python) ou utilisez la méthode plus lente. Si vous n'avez pas besoin d'identifier le nom, puis utilisez zcat -r
.
J'espère que cela aide
find . -name "*.gz"|xargs zcat | grep "pattern"
ça devrait aller.
zgrep "string" ./*/*
Vous pouvez utiliser la commande ci - dessus pour rechercher string
dans.fichiers gz du répertoire dir
Où dir
a la structure des sous-répertoires suivante:
/dir
/childDir1
/file1.gz
/file2.gz
/childDir2
/file3.gz
/file4.gz
/childDir3
/file5.gz
/file6.gz