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

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

处理日志文件时,有些最终会成为 gzip 压缩文件,logrotate而另一些则不会。所以当你尝试这样的事情时:

$ zcat *

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

gzip: xyz.log: not in gzip format

是否有一个工具可以获取神奇字节,类似于file工作原理,并使用zcatcat取决于结果,以便我可以将输出通过管道传输到grep例如?

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

答案1

尝试使用-f--force

zcat -f -- *

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

exec gzip -cd "$@"

长选项可以转化为

exec gzip --stdout --decompress "$@"

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

-f--强制
      即使文件有多个链接也强制压缩或解压
      或者相应的文件已经存在,或者压缩数据是
      从终端读取或写入终端。如果输入数据不是某种格式
      gzip 可以识别,如果还给出了 --stdout 选项,则复制
      输入数据而不改变标准输出:让 zcat 表现得像猫一样

还:

这样我就可以将输出传输到grep例如

你可以用zgrep它:

zgrep -- PATTERN *

不过请参阅下面 Stéphane 的评论。

答案2

zless

这似乎很遗憾zcat,因为 libz 有一个 API 支持透明地读取压缩和未压缩文件。但联机帮助页确实说这zcat相当于gunzip -c.

答案3

我出于同样的目的使用:

{ cat /var/log/messages ; zcat /var/log/messages*.gz ; }| grep something | grep "something else" ....

答案4

这在 RHEL 5.x 中运行良好,其中 zcat 是二进制文件。它在 RHEL 6.x(和 Ubuntu 12.x)中失败,其中 zcat 是一个脚本。这用过的工作顺利。

我根本不会使用 zcat,但 zgrep 也无法正确处理未压缩的文件。

相关内容