在tar文件中执行grep操作而不提取

Pav*_*mar 29 unix

我有包含特定模式的文件列表,但这些文件已被涂焦.现在我想在tar文件中搜索模式,并且知道哪些文件包含模式而不提取文件.

任何的想法...?

gho*_*g74 38

tar命令有一个-O开关,用于将文件解压缩到标准输出.所以你可以输出那些输出grep/awk

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

tar xvf  test.tar -O | grep "pattern"
Run Code Online (Sandbox Code Playgroud)

例如,返回一个找到的模式的文件名

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
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,这不会给出匹配文件的名称。 (2认同)

Rob*_*uil 26

该命令zgrep应该直接完成您想要的操作.

例如

zgrep "mypattern" *.gz
Run Code Online (Sandbox Code Playgroud)

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

  • `zgrep -a pattern myfile.tar.gz` (6认同)
  • 这个问题是关于tar文件,而不是gzip压缩文件. (4认同)

Chi*_*aca 7

GNU tar--to-command.有了它,您可以tar将存档中的每个文件传输到给定的命令中.对于您只想要匹配的行的情况,该命令可以很简单grep.要知道文件名,您需要利用tar在命令环境中设置某些变量; 例如,

tar xaf thing.tar.xz --to-command="awk -e '/thing.to.match/ {print ENVIRON[\"TAR_FILENAME\"] \":\", \$0}'"
Run Code Online (Sandbox Code Playgroud)

因为我发现自己经常使用这个,我有这个:

#!/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}'"
Run Code Online (Sandbox Code Playgroud)

  • grep命令支持--label =“ $ TAR_FILENAME”; 无需使用`awk`。 (2认同)

g.r*_*ket 6

tar --to-command这可以通过和 来完成grep --label

tar xaf archive.tar.gz --to-command 'egrep -Hn --label="$TAR_FILENAME" your_pattern_here || true'
Run Code Online (Sandbox Code Playgroud)
  • --label给 grep 文件名
  • -H告诉 grep 显示文件名和-n行号
  • || true否则,如果未找到模式,grep 将退出并显示错误,并tar会抱怨这一点。
  • xaf意味着根据文件扩展名提取并自动解压缩
  • --to-commandtar 将 tarfile 中的每个文件传递给 grep 的单独调用,并使用有关该文件的信息设置各种环境变量。请参阅联机帮助页以获取更多信息。

很大程度上基于Chipaca 的答案(以及 Daniel H 的评论),但这应该更容易使用,只需使用 tar 和 grep。