unix - utilizar - Realizando la operación grep en archivos tar sin extraer
grep varias palabras (5)
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.
Alguna idea...?
El módulo Tarfile.extractfile()
Python junto con Tarfile.extractfile()
le permitirá inspeccionar el contenido del tarfile
Tarfile.extractfile()
sin extraerlo al disco.
El comando zgrep
debería hacer exactamente lo que quieras, directamente.
por ejemplo
zgrep "mypattern" *.gz
GNU tar
tiene --to-command
. Con él, puede tener un tubo de tar
cada archivo del archivo en el comando dado. Para el caso donde solo quieres 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}''"
Debido a que me encuentro usando 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}''"
La forma más fácil es 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 al archivo tar real.
Pendiente ~/.avfs/
(el punto de montaje) y anexando # permite que avfs exponga el archivo tar como un directorio.
el comando tar
tiene un -O
para extraer tus archivos a la salida estándar. Entonces puedes canalizar esos resultados a grep/awk
tar xvf test.tar -O | awk ''/pattern/{print}''
tar xvf test.tar -O | grep "pattern"
por ejemplo, para devolver el nombre del archivo, un patrón encontrado
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