2009-08-10 18 views
40

Il mio problema attuale è che ho circa 10 cartelle, che contengono file gzippati (circa in media 5 ciascuno). Questo rende 50 file da aprire e guardare.trova la stringa all'interno di un file gzip in una cartella

Esiste un metodo più semplice per scoprire se un file gzip in una cartella ha un motivo particolare o no?

zcat ABC/myzippedfile1.txt.gz | grep "pattern match" 
zcat ABC/myzippedfile2.txt.gz | grep "pattern match" 

Invece di scrivere una sceneggiatura, posso fare lo stesso in una sola linea, per tutte le cartelle e sottocartelle?

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

risposta

47

zgrep cercherà in file compressi con gzip, ha un'opzione ricorsiva -R, ed un -H mi mostra l'opzione filename:

zgrep -R --include=*.gz -H "pattern match" . 
+12

FWIW, il mio zgrep non supporta -R – ZombieDev

+0

@Ned Batchelder, Grazie per aver dato una direzione. Ma secondo me ha funzionato zgrep opzioni file "pattern" – hiren

+0

'zgrep -R --include = \ *. Gz -H" pattern "' su zsh – blacktooth

7

utilizzare il comando Trova

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

o cercare con l'opzione ricorsiva (-r) di zcat

+0

-bash-3.00 $ find. -name "* .gz" -exec zcat "{}" + | grep "NOT OK" find: argomento mancante a '-exec ' qualcosa sembra mancare dopo exec? – gagneet

+0

funziona per me. – ghostdog74

+0

forse prova a cambiare per trovare ... +; | grep ... e vedi – ghostdog74

18

Non è necessario zcat qui perché c'è zgrep e zegrep.

Se si desidera eseguire un comando su una gerarchia di directory, si utilizza ritrovamento:

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

E anche “ls *.gz” è inutile in per e si deve solo usare “* .gz " nel futuro.

+0

Ottengo le linee che contengono questo modello, ma non il nome del file con questo metodo. C'è un modo per ottenere che anche elencato? – gagneet

+2

'trova. -name '* .gz' -print0 | xargs -0 modello zgrep'? – Hasturkun

+2

Vecchio trucco di grep: trovare. -name "* .gz" -exec zgrep ⟨pattern⟩/dev/null \ {\} \; # Questo farà capire a grep che c'è più di un singolo file e stampare il nome del file. –

6

come zgrep non supportano -R

penso che il soluzione del "Nietzche-jou" potrebbe essere una risposta migliore, ma vorrei aggiungere l'opzione -H per mostrare il nome del file o meno così

find . -name "*.gz" -exec zgrep -H 'PATTERN' \{\} \; 
+0

Grazie per il comando per mostrare il nome del file :) –

6

Venendo in un po 'in ritardo su questo, ha avuto un problema simile ed era in grado di r esullare usando;

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

Come indicato di seguito;

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

Tuttavia, questo non mostra il file originale che il risultato abbinato da, mostrando invece "(standard input)", come è proveniente da un tubo. zcat non sembra supportare anche l'uscita di un nome.

In termini di prestazioni, questo è ciò che abbiamo ottenuto;

$ 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 

Come si può vedere, utilizzando il metodo find|zcat è significativamente più lento rispetto all'utilizzo zcat -r quando si tratta di anche un piccolo volume di file. Non ero nemmeno in grado di far vedere a zcat il nome del file (usando -v apparirà il nome del file, ma non su ogni singola riga). Sembrerebbe che al momento non ci sia uno strumento che fornisca sia la velocità sia la coerenza del nome con grep (cioè l'opzione -H).

Se è necessario identificare il nome del file a cui appartiene il risultato, sarà necessario scrivere il proprio strumento (potrebbe essere eseguito in 50 righe di codice Python) o utilizzare il metodo più lento. Se non è necessario identificare il nome, utilizzare zcat -r.

Spero che questo aiuti

2

find . -name "*.gz"|xargs zcat | grep "pattern" dovrebbe fare.

Problemi correlati