varias utilizar utiliza test solo siguientes regulares regresará que puede parametros palabras palabra líneas los expresiones exacta cómo cuál con comiencen comandos comando caracteres buscar unix

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...?




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