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