Выполнение операции grep в файлах tar без распаковки - PullRequest
26 голосов
/ 09 марта 2010

У меня есть список файлов, которые содержат определенные шаблоны, но эти файлы были заархивированы. Теперь я хочу найти шаблон в файле tar и узнать, какие файлы содержат шаблон, без извлечения файлов.

Есть идеи ...?

Ответы [ 5 ]

35 голосов
/ 09 марта 2010

команда tar имеет переключатель -O для извлечения файлов в стандартный вывод. Таким образом, вы можете передать эти выходные данные grep/awk

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

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

например, для возврата имени файла найден один шаблон

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
22 голосов
/ 11 сентября 2013

Команда zgrep должна делать именно то, что вы хотите, напрямую.

например

zgrep "mypattern" *.gz

http://linux.about.com/library/cmd/blcmdl1_zgrep.htm

7 голосов
/ 28 апреля 2014

GNU tar имеет --to-command. С его помощью вы можете tar передать каждый файл из архива в данную команду. Для случая, когда вы просто хотите, чтобы строки совпадали, эта команда может быть простой grep. Чтобы узнать имена файлов, вам нужно воспользоваться tar, устанавливающим определенные переменные в среде команды; например,

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

Поскольку я часто использую это, у меня есть это:

#!/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}'"
2 голосов
/ 09 марта 2010

Самый простой способ - использовать avfs . Я использовал это раньше для таких задач.

В основном, синтаксис:

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

/path/to/file.tar - это путь к реальному файлу tar.

Предварительное ожидание ~/.avfs/ (точка монтирования) и добавление # позволяют avfs предоставлять файл tar в качестве каталога.

2 голосов
/ 09 марта 2010

Модуль Python tarfile вместе с Tarfile.extractfile() позволит вам проверять содержимое архива без его извлечения на диск.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...