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

Unix 在tar文件中执行grep操作而不提取,unix,Unix,我有一个包含特定模式的文件列表,但这些文件已经涂上了焦油。现在我想搜索tar文件中的模式,并知道哪些文件包含该模式,而不提取文件 有什么想法吗?Python和它一起将允许您检查tarball的内容,而无需将其解压缩到磁盘。最简单的方法可能是使用。我以前也用过这种方法 基本上,语法是: avfsd ~/.avfs # Sets up a avfs virtual filesystem rgrep pattern ~/.avfs/path/to/file.tar#/ /path/to/file.t

我有一个包含特定模式的文件列表,但这些文件已经涂上了焦油。现在我想搜索tar文件中的模式,并知道哪些文件包含该模式,而不提取文件


有什么想法吗?

Python和它一起将允许您检查tarball的内容,而无需将其解压缩到磁盘。

最简单的方法可能是使用。我以前也用过这种方法

基本上,语法是:

avfsd ~/.avfs # Sets up a avfs virtual filesystem
rgrep pattern ~/.avfs/path/to/file.tar#/
/path/to/file.tar
是实际tar文件的路径


预挂起的
~/.avfs/
(挂载点)和附加允许avfs将tar文件公开为目录

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

命令
zgrep
应该直接执行您想要的操作

比如说

zgrep "mypattern" *.gz

GNU
tar
拥有
--命令
。使用它,您可以让
tar
将归档文件中的每个文件导入到给定的命令中。对于只需要匹配的行的情况,该命令可以是一个简单的
grep
。要知道文件名,您需要利用tar在命令环境中设置某些变量;比如说,

tar xaf thing.tar.xz --to-command="awk -e '/thing.to.match/ {print ENVIRON[\"TAR_FILENAME\"] \":\", \$0}'"
因为我发现自己经常使用它,所以我有:

#/垃圾箱/垃圾箱
set-eu
如果[$#-lt 2];然后
echo“用法:$(基本名称“$0”)”
出口1
fi
if[-t1];然后
h=“$(tput setf 4)”
m=“$(tput setf 5)”
f=“$(tput sgr0)”
其他的
h=“”
m=“”
f=“”
fi
tar xaf“$2”-to command=“awk-e”/$1/{gsub(\“$1\”,\“$m&$f\”);print\“$h\”ENVIRON[\“tar\u FILENAME\”]\“$f:\”,\$0}”

使用选项
-z
实际上非常简单:

-z, --decompress
        Decompress files to search, when compressed.  Archives (.cpio,
        .pax, .tar, and .zip) and compressed archives (e.g. .taz, .tgz,
        .tpz, .tbz, .tbz2, .tb2, .tz2, .tlz, and .txz) are searched and
        matching pathnames of files in archives are output in braces.  If
        -g, -O, -M, or -t is specified, searches files within archives
        whose name matches globs, matches file name extensions, matches
        file signature magic bytes, or matches file types, respectively.
        Supported compression formats: gzip (.gz), compress (.Z), zip,
        bzip2 (requires suffix .bz, .bz2, .bzip2, .tbz, .tbz2, .tb2, .tz2),
        lzma and xz (requires suffix .lzma, .tlz, .xz, .txz).
例如:

ugrep -z PATTERN archive.tgz
$ ugrep -z "Hello" archive.tgz
{Hello.bat}:echo "Hello World!"
Binary file archive.tgz{Hello.class} matches
{Hello.java}:public class Hello // prints a Hello World! greeting
{Hello.java}:  { System.out.println("Hello World!");
{Hello.pdf}:(Hello)
{Hello.sh}:echo "Hello World!"
{Hello.txt}:Hello
这将使每个存档文件变灰,以显示与存档文件名匹配的
模式。归档文件名以大括号显示,以区别于普通文件名。其他一切都与grep相同(ugrep具有相同的选项并产生相同的输出)。例如:

ugrep -z PATTERN archive.tgz
$ ugrep -z "Hello" archive.tgz
{Hello.bat}:echo "Hello World!"
Binary file archive.tgz{Hello.class} matches
{Hello.java}:public class Hello // prints a Hello World! greeting
{Hello.java}:  { System.out.println("Hello World!");
{Hello.pdf}:(Hello)
{Hello.sh}:echo "Hello World!"
{Hello.txt}:Hello
如果只需要文件名,请使用选项
-l
--具有匹配项的文件
),并使用选项
--format=“%z%~”
自定义文件名输出以去掉大括号:

$ ugrep -z Hello -l --format="%z%~" archive.tgz
Hello.bat
Hello.class
Hello.java
Hello.pdf
Hello.sh
Hello.txt

搜索tarball(
.tar.gz
/
.tgz
.tar.bz2
/
.tbz
.tar.xz
/
.txz
.tar.lzma
/
.tlz
)以及
.zip
存档。

这可以通过
tar to-to-to-to-to-command
标签来完成:

tar xaf archive.tar.gz——命令'egrep-Hn--label=“$tar_FILENAME”您的_模式| | | true'
  • --label
    为grep提供文件名
  • -H
    告诉grep显示文件名,
    -n
    显示行号
  • | | true
    ,否则,如果找不到模式,grep将以错误退出,
    tar
    将对此进行投诉
  • xaf
    表示根据文件扩展名进行提取和自动解压缩
  • --to命令
    让tar将tar文件中的每个文件传递给单独的grep调用,并使用文件信息设置各种环境变量。有关更多信息,请参阅

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

不幸的是,这不会给出匹配文件的名称。因此,在存档文件之后,将其中一个涂了焦油的文件的名称提供给tar,只提供该文件的内容!这在哪里有记录?你能告诉我吗?@AnkurAgarwal--
-x
-提取
-获取
:从存档中提取文件。参数是可选的。当给定时,它们指定要提取的档案成员的名称。@AnkurAgarwal不可否认,这是一个著名的例子。(相关XKCD)这个问题的可能重复是关于tar文件,而不是gzip。
zgrep-模式myfile.tar.gz
我的awk不接受
-e
,但这在其他方面是完美的。
grep
命令支持
--label=“$tar_FILENAME”
;无需使用
awk