处理日志文件时,有些最终会成为 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
工作原理,并使用zcat
或cat
取决于结果,以便我可以将输出通过管道传输到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 也无法正确处理未压缩的文件。