web-dev-qa-db-fra.com

rechercher 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 compressés (environ 5 en moyenne chacun). Cela fait 50 fichiers à ouvrir et à regarder.

Existe-t-il une méthode plus simple pour savoir si un fichier compressé dans un dossier a un modèle 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 sur une seule ligne, pour tous les dossiers et sous-dossiers?

for f in `ls *.gz`; do echo $f; zcat $f | grep <pattern>; done;
44
gagneet

zgrep cherchera dans les fichiers gzippés, a une option -R récursive et -H me montrer l'option nom de fichier:

zgrep -R --include=*.gz -H "pattern match" .
50
Ned Batchelder

Vous n'avez pas besoin de zcat ici car il y a zgrep et zegrep.

Si vous souhaitez exécuter une commande sur une hiérarchie de répertoires, vous utilisez find:

find . -name "*.gz" -exec zgrep ⟨pattern⟩ \{\} \;

Et aussi "ls *.gz ”Est inutile dans for et vous devriez simplement utiliser“ * .gz ”à l'avenir.

20
Nietzche-jou

comment zgrep ne prend pas en charge -R

Je pense que la solution de "Nietzche-jou" pourrait être une meilleure réponse, mais j'ajouterais l'option -H pour afficher le nom du fichier quelque chose comme ça

find . -name "*.gz" -exec zgrep -H 'PATTERN' \{\} \;
8
Francisco Lavin

utilisez la commande find

find . -name "*.gz" -exec zcat "{}" + |grep "test"

ou essayez d'utiliser l'option récursive (-r) de zcat

7
ghostdog74

Arriver un peu tard, a eu un problème similaire et a pu résoudre l'utilisation;

zcat -r /some/dir/here | grep "blah"

Comme détaillé ici;

http://manpages.ubuntu.com/manpages/quantal/man1/gzip.1.html

Cependant, cela n'affiche pas le fichier d'origine à partir duquel le résultat correspond, mais affiche plutôt "(entrée standard)" lorsqu'il provient d'un tuyau. zcat ne semble pas non plus prendre en charge la sortie d'un nom.

En termes de performances, c'est ce que nous avons obtenu;

$ 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 le voir, en utilisant le find|zcat la méthode est beaucoup plus lente que l'utilisation de zcat -r lorsque vous traitez même un petit volume de fichiers. Je n'ai pas non plus pu faire sortir zcat le nom du fichier (en utilisant -v affichera apparemment le nom du fichier, mais pas sur chaque ligne). Il semblerait qu'il n'existe actuellement aucun outil qui fournisse à la fois la vitesse et la cohérence des noms avec grep (c'est-à-dire le -H option).

Si vous devez identifier le nom du fichier auquel appartient le résultat, vous devrez alors écrire votre propre outil (cela peut être fait en 50 lignes de Python) ou utiliser le Si vous n'avez pas besoin d'identifier le nom, utilisez zcat -r.

J'espère que cela t'aides

6
sleepycal

find . -name "*.gz"|xargs zcat | grep "pattern" devrait faire.

2
Ajit Kumar

zgrep "string" ./*/*

Vous pouvez utiliser la commande ci-dessus pour rechercher string dans les fichiers .gz du répertoire dirdir a la structure de sous-répertoires suivante:

/dir
    /childDir1
              /file1.gz
              /file2.gz
    /childDir2
              /file3.gz
              /file4.gz
    /childDir3
              /file5.gz
              /file6.gz
1
todipratik