2010-03-09 15 views
20

Tengo una lista de archivos que contienen patrones particulares, pero esos archivos han sido alquitranados. Ahora quiero buscar el patrón en el archivo tar y saber qué archivos contienen el patrón sin extraer los archivos.Realizando la operación grep en archivos tar sin extraer

¿Alguna idea ...?

+0

posible duplicado de [Cómo grep para un patrón en los archivos de archivo tar sin llenar el espacio de disco] (http://stackoverflow.com/questions/13041068/how-to-grep-for-a-pattern-in-the-files-in-tar-archive-without-filling-up-disk-sp) – tripleee

Respuesta

25

el comando tar tiene un interruptor -O para extraer sus archivos a la salida estándar. Así se puede canalizar la salida a los grep/awk

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

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

por ejemplo, para regresar nombre de archivo de un patrón que se encuentra

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

Lamentablemente, no dará los nombres de los archivos coincidentes. – jkff

+0

hará un poco de scripting. ver mi edición – ghostdog74

+1

¡Así que dar el nombre de uno de los archivos tarred up a tar después de que el archivo de almacenamiento da solo el contenido de ese archivo! ¿Dónde está esto documentado? ¿Puedes decirlo? – abc

2

La manera más fácil es probablemente usar avfs. Lo he usado antes para tales tareas.

Básicamente, la sintaxis es:

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

/path/to/file.tar es la ruta de acceso al archivo tar real.

Pendiente ~/.avfs/ (el punto de montaje) y anexando # permite que avfs exhiba el archivo tar como un directorio.

7

GNU tar tiene --to-command. Con él puede tener tar pipe cada archivo del archivo en el comando dado. Para el caso donde solo desea las líneas que coinciden, ese comando puede ser un simple grep. Para conocer los nombres de los archivos, necesita aprovechar la configuración tar de ciertas variables en el entorno del comando; por ejemplo,

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

Porque me encuentro con esto a menudo, tengo esto:

#!/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

mi awk no toma' '' -e''', pero esto es perfecto. – GaryO

+1

El comando 'grep' admite' --label = "$ TAR_FILENAME" '; no es necesario usar 'awk'. –

Cuestiones relacionadas