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}'"
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