这三个命令是什么
它们是 gzip 的透明包装:zcat 等价于 gzip -dc,把解压结果写到标准输出;zgrep 是一个 shell 脚本,内部就是 gzip -dc 管道进 grep;zless 则把解压流交给 less。因为是流式解压,读归档日志不需要先解开一个 GB 级的文件,也不额外占磁盘。与「先 gunzip 再 grep」相比,好处是省磁盘也省等待:gunzip 会把整包完整落盘,还要等解压跑完才能看到第一行,流式方案几乎立刻就能看到结果,代价是每次检索都要重新解压一遍。同族工具覆盖 bzip2、xz、zstd 等格式,用法一一对应。
基本信息
| 适用平台 | Linux 通用(gzip 套件,zgrep 与 zless 本质是脚本) |
|---|---|
| 命令语法 | zcat 文件 / zgrep [grep选项] 模式 文件 / zless 文件 |
| 等价写法 | zcat = gzip -dc;zgrep = zcat 管道 grep;zless = zcat 管道 less |
| 同族工具 | bzcat/bzgrep、xzcat/xzgrep、zstdcat/zstdgrep |
| 常见对象 | logrotate 产出的 .log.1.gz、.log.2.gz 等归档日志 |
典型使用场景
- 查历史日志:报错今天才发现,但现场在几天前的归档里
- 统计与聚合:zgrep -c 数次数,或接 awk 做条件统计
- 核对归档完整性:zcat 报错说明压缩包在写入或传输时被截断
- 翻页浏览:内容不多时用 zless,比先 gunzip 再 less 省事
- 跨多个归档搜索:一次覆盖 .1.gz 到 .N.gz,不必逐个解开
- 配合 logrotate 的轮转命名:按 .log.1.gz、.log.2.gz 的序号通配,不用关心解压后的临时文件该放哪
常用示例
常用示例
zcat access.log.2.gz | head # 直接查看归档开头
zgrep -i error /var/log/nginx/access.log.*.gz # 跨多个归档搜索,忽略大小写
zgrep -c ' 500 ' access.log.*.gz | awk -F: '{s+=$2} END{print s}' # 分文件计数后求和
zgrep -h 'ERROR' app.log.*.gz | sort | uniq -c | sort -rn # 归类错误信息
zless older.log.gz # 翻页浏览
zcat big.log.gz | awk '$9==502' | wc -l # 解压后交给 awk 做条件统计
gzip -t archive.log.4.gz && echo OK # 单独校验归档是否完整按格式选工具
| 文件格式 | 查看 | 搜索 |
|---|---|---|
| .gz(gzip) | zcat | zgrep |
| .bz2(bzip2) | bzcat | bzgrep |
| .xz(xz / lzma) | xzcat | xzgrep |
| .zst(zstd) | zstdcat | zstdgrep |
| .zip(归档,非单一数据流) | unzip -p 包 成员 | unzip -p 包 成员 管道 grep |
这三个工具每次调用都会完整解压一遍:同一份 GB 级归档要在半小时内反复检索,先 gunzip -k 留一份未压缩副本反而更快(前提是磁盘放得下);只是偶尔查一两行,流式解压不占磁盘,更划算。
zcat 报 unexpected end of file 说明压缩包不完整:下载或传输被截断,也可能是写入时磁盘满了。脚本里要判退出码再决定是否把结果当真,单独判断完整性用 gzip -t。
不要用 cat 或 less 直接读 .gz,输出是乱码;先 file 看类型再选工具。GB 级归档建议先用 zgrep 缩小范围,zless 是边解压边渲染,从头一页页翻会很慢。另外 .tar.gz 的外层只是压缩,zcat 出来的仍是 tar 归档流;要列内容或取出单个文件,得走 tar -tzf 与 tar -xzf。