2013-08-02 12 views
8

ho un problema che sto sperando che qualcuno sarà in grado di aiutare con ...grep -f sul file in una cartella compressa

sto eseguendo una ricorsiva fgrep/grep -f ricerca su un cartella compressa utilizzando il seguente comando in uno dei miei programmi:

il comando che sto usando

grep -r -i -z -I -f /path/to/pattern/file /home/folder/TestZipFolder.zip 

All'interno del file modello è la stringa "Dog" che sto cercando di cercare.

Nella cartella zippata sono presenti numerosi file di testo contenenti la stringa "Cane".

Il comando grep -f trova correttamente i file di testo contenenti la stringa "Cane" in 3 file all'interno della cartella zippata, ma stampa l'output tutto su una riga e alcuni caratteri strani compaiono alla fine cioè PK (come mostrato sotto). E quando provo e stampare l'output in un file nel mio programma altri personaggi appaiono alla fine come ^B^T^@

uscita dal comando grep -f:

TestZipFolder/test.txtThis is a file containing the string DogPKtest1.txtDog, is found again in this file.PKTestZipFolder/another.txtDog is written in this file.PK 

Come vorrei avere ciascuno di i file in cui è stata trovata la stringa "Cane" per stampare su una nuova riga in modo che non siano tutti raggruppati insieme su un'unica riga come sono ora? Dov'è il "PK" e altri strani caratteri che appaiono nell'output e come posso impedire che vengano visualizzati?

output desiderato

TestZipFolder/test.txt:This is a file containing the string Dog 
TestZipFolder/test1.txt:Dog, is found again in this file 
TestZipFolder/another.txt:Dog is written in this file 

Qualcosa in questo senso, per cui l'utente è in grado di vedere dove la stringa può essere trovata nel file (è effettivamente ottenere l'output in questo formato se si esegue il grep comando su un file che non è un file zip).

vostro aiuto con questo è molto apprezzato, grazie

risposta

10

Se avete bisogno di un uscita multilinea, meglio usare zipgrep:

zipgrep -s "pattern" TestZipFolder.zip 

il -s è quella di sopprimere i messaggi di errore (opzionale) . Questo comando stamperà tutte le linee abbinate insieme al nome del file. Se si desidera rimuovere i nomi duplicati, quando più di una corrispondenza è in un file, è necessario eseguire un'altra elaborazione utilizzando loop/grep o awk o sed.

realtà, zipgrep è una combinazione egrep e decomprimere. E il suo uso è il seguente:

zipgrep [egrep_options] pattern file[.zip] [file(s) ...] [-x xfile(s) ...] 

in modo da poter passare delle opzioni egrep ad esso.

+0

c'è un modo per mostrare anche dove si trova la corrispondenza nel file come nel comando grep nella mia domanda ?, invece di elencare semplicemente il file in cui è stato trovato? - grazie mille –

+0

puoi fornire l'output desiderato? Se lo fai, posso provare. – blackSmith

+0

Aggiornato la mia domanda per mostrare l'output desiderato. È lo stesso formato in cui si trova l'output se si esegue il comando grep su una cartella che non è un file zip (cioè fornisce il nome del file in cui è stata trovata una corrispondenza dopo che i due punti mostrano dove si trova) grazie molto –