在 Linux 运维和问题排查中,经常会遇到这样的需求:
- 命令输出内容很大(日志、抓包、SQL 结果)
- 不想先生成一个巨大文本文件再压缩
- 希望一步完成:输出 → 压缩 → 文件
Linux 的管道和重定向机制可以非常优雅地解决这个问题。
一、为什么不用「先输出再压缩」
传统方式通常是:
command > output.txt gzip output.txt
问题在于:
- 会产生一个未压缩的大文件
- 占用磁盘空间
- 中间文件容易忘记删除
- 对日志、抓包类场景不友好
更好的方式是:输出直接进入压缩程序。
二、最常用方式:管道 + gzip
基本用法
command | gzip > output.gz
示例:
ls -l /var/log | gzip > log_list.gz
解释:
command:任意命令|:管道,把标准输出交给下一个程序gzip:从 stdin 读取数据并压缩>:重定向到压缩文件
✅ 整个过程不会生成中间文本文件
三、常见压缩工具对照
| 压缩工具 | 命令示例 | 特点 |
|---|---|---|
| gzip | cmd | gzip > out.gz | 速度快,通用 |
| bzip2 | cmd | bzip2 > out.bz2 | 压缩率更高,速度慢 |
| xz | cmd | xz > out.xz | 压缩率最高,CPU 占用高 |
示例:
ps aux | bzip2 > ps.bz2 netstat -an | xz > netstat.xz
四、既想看输出,又想保存压缩文件(tee)
有些场景下,你希望:
- 终端还能看到输出
- 同时保存为压缩文件
可以使用 tee:
command | tee >(gzip > output.gz)
示例:
dmesg | tee >(gzip > dmesg.gz)
解释:
tee:一份输出到终端>(...):进程替换,把数据送给 gzip
这是一个非常适合排障现场的写法。
五、将错误输出也一起压缩
默认情况下,只有 stdout 会被管道接收。
如果你想把 stderr 一起压缩:
command 2>&1 | gzip > output.gz
示例:
find / -name core 2>&1 | gzip > find_core.gz
六、与 tar 的区别(很多人容易混)
tar 是「打包 + 压缩文件」
tar -czf files.tar.gz /path/to/dir
gzip 是「压缩数据流」
command | gzip > output.gz
👉 如果你只是想保存命令输出结果,不需要 tar。
七、典型实战场景
1️⃣ 保存抓包或排查数据
tcpdump -i eth0 -n | gzip > traffic.log.gz
2️⃣ 导出数据库查询结果
mysql -e "select * from big_table" | gzip > result.gz
3️⃣ 保存大量日志分析结果
grep ERROR app.log | gzip > error_only.gz
八、总结
一句话原则:
命令输出 → 管道 → 压缩程序 → 重定向文件
通用模板:
command | gzip > output.gz
这是 Linux 下处理大输出量数据时最干净、最高效的方式之一。
