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;
40
demandé sur Nietzche-jou 2009-08-10 12:58:58

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" .
47
répondu Ned Batchelder 2009-08-10 11:08:30

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.

19
répondu Nietzche-jou 2009-08-10 09:06:29

Utilisez la commande find

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

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

7
répondu ghostdog74 2009-08-10 09:04:44

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' \{\} \;
7
répondu Francisco Lavin 2012-03-28 16:47:12

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

6
répondu sleepycal 2013-10-09 16:07:30

find . -name "*.gz"|xargs zcat | grep "pattern" ça devrait aller.

2
répondu Ajit Kumar 2013-11-26 02:59:46

zgrep "string" ./*/*

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

/dir
    /childDir1
              /file1.gz
              /file2.gz
    /childDir2
              /file3.gz
              /file4.gz
    /childDir3
              /file5.gz
              /file6.gz
0
répondu todipratik 2018-09-14 06:11:23