有没有透明结合zcat和cat的工具?

0xC*_*22L 85 gzip text-processing cat

在处理日志文件时,由于某些原因,有些最终会成为 gzipped 文件,logrotate而有些则不会。所以当你尝试这样的事情时:

$ zcat *
Run Code Online (Sandbox Code Playgroud)

你最终得到一个命令行zcat xyz.log xyz.log.1 xyz.log.2.gz xyz.log.3.gz,然后是:

gzip: xyz.log: not in gzip format
Run Code Online (Sandbox Code Playgroud)

是否有一种工具可以使用魔术字节,类似于file工作原理,并使用zcatcat取决于结果,以便我可以将输出传输到grep例如?

注意:我知道我可以编写脚本,但我想知道是否已经有工具了。

don*_*sti 121

-f或试试--force

zcat -f -- *
Run Code Online (Sandbox Code Playgroud)

因为zcat只是一个运行的简单脚本

exec gzip -cd "$@"
Run Code Online (Sandbox Code Playgroud)

有很长的选项可以转化为

exec gzip --stdout --decompress "$@"
Run Code Online (Sandbox Code Playgroud)

并且,根据man gzip(强调我的):

-f --force
      即使文件有多个链接,也强制压缩或解压缩
      或者对应的文件已经存在,或者如果压缩数据是
      从终端读取或写入终端。如果输入数据的格式不正确
      被 gzip 识别,如果还给出了 --stdout 选项,则复制
      输入数据而不改变标准输出:让 zcat 表现为 cat

还:

这样我就可以将输出通过管道传输到grep例如

你可以使用zgrep

zgrep -- PATTERN *
Run Code Online (Sandbox Code Playgroud)

尽管请参阅下面的 Stéphane 评论。

  • 请注意,`zless` 和`zgrep` 都是调用`gzip -cdfq`(即`zcat -fq`)的脚本。 (6认同)

sou*_*edi 44

zless

似乎有点可惜zcat,因为 libz 有一个 API,它支持透明地从压缩和未压缩文件中读取。但是联机帮助页确实说这zcat等效于gunzip -c.


小智 13

我完全出于同样的目的使用:

{ cat /var/log/messages ; zcat /var/log/messages*.gz ; }| grep something | grep "something else" ....
Run Code Online (Sandbox Code Playgroud)


小智 8

有一个名为 zutils 的 ztools(zcat、zgrep、..)的替代品,可以独立于后端将所有解压工具联合起来。因此,使用相同的命令,您可以透明地读取普通、lzma、gzipped、xz 文件。

它在 debian wheezy 或更新版本中可用,也可能在 redhat/centos 中可用。

该项目的页面是这里nongnu.org

一篇解释 util 用法的博客文章(noone.org