2010-03-09 7 views
20

Ho una lista di file che contengono pattern particolari, ma questi file sono stati catramati. Ora voglio cercare il pattern nel file tar e sapere quali file contengono il pattern senza estrarre i file.Esecuzione dell'operazione grep nei file tar senza estrarre

Qualche idea ...?

+0

possibile duplicato di [Come grep per un modello nei file di archivio tar senza riempire lo spazio su disco] (http://stackoverflow.com/questions/13041068/how-to-grep-for-a-pattern-in-the-files-in-tar-archive-without-filling-up-disk-sp) – tripleee

risposta

25

il comando tar ha uno switch -O per estrarre i file sullo standard output. Quindi, è possibile reindirizzare coloro output a grep/awk

tar xvf test.tar -O | awk '/pattern/{print}' 

tar xvf test.tar -O | grep "pattern" 

ad esempio per tornare il nome del file uno schema trovato

tar tf myarchive.tar | while read -r FILE 
do 
    if tar xf test.tar $FILE -O | grep "pattern" ;then 
     echo "found pattern in : $FILE" 
    fi 
done 
+0

Sfortunatamente quello non darà i nomi dei file corrispondenti. – jkff

+0

farà un po 'di scripting. vedi la mia modifica – ghostdog74

+1

Quindi dando il nome di uno dei file tarati a tar dopo che il file di archivio ha dato solo il contenuto di quel file! Dove è documentato? Per favore, puoi dirlo? – abc

2

Il modo più semplice è probabilmente utilizzare avfs. Ho usato questo prima per tali compiti.

In sostanza, la sintassi è:

avfsd ~/.avfs # Sets up a avfs virtual filesystem 
rgrep pattern ~/.avfs/path/to/file.tar#/ 

/path/to/file.tar è il percorso del file tar vero e proprio.

Pre-attesa ~/.avfs/ (il punto di montaggio) e l'aggiunta di # consente a avfs di esporre il file tar come directory.

7

GNU tar ha --to-command. Con esso puoi avere tar pipe ogni file dall'archivio nel comando dato. Nel caso in cui desideri semplicemente le linee corrispondenti, tale comando può essere un semplice grep. Per conoscere i nomi dei file è necessario trarre vantaggio dal tar che imposta determinate variabili nell'ambiente del comando; per esempio,

tar xaf thing.tar.xz --to-command="awk -e '/thing.to.match/ {print ENVIRON[\"TAR_FILENAME\"] \":\", \$0}'" 

Perché mi trovo con questo spesso, ho questo:

#!/bin/sh 
set -eu 

if [ $# -lt 2 ]; then 
    echo "Usage: $(basename "$0") <pattern> <tarfile>" 
    exit 1 
fi 

if [ -t 1 ]; then 
    h="$(tput setf 4)" 
    m="$(tput setf 5)" 
    f="$(tput sgr0)" 
else 
    h="" 
    m="" 
    f="" 
fi 

tar xaf "$2" --to-command="awk -e '/$1/{gsub(\"$1\", \"$m&$f\"); print \"$h\" ENVIRON[\"TAR_FILENAME\"] \"$f:\", \$0}'" 
+0

il mio awk non accetta' '' -e''', ma questo è altrimenti perfetto. – GaryO

+1

Il comando 'grep' supporta' --label = "$ TAR_FILENAME" '; non c'è bisogno di usare 'awk'. –

Problemi correlati