在 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 读取数据并压缩
  • >:重定向到压缩文件

整个过程不会生成中间文本文件


三、常见压缩工具对照

压缩工具命令示例特点
gzipcmd | gzip > out.gz速度快,通用
bzip2cmd | bzip2 > out.bz2压缩率更高,速度慢
xzcmd | 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 下处理大输出量数据时最干净、最高效的方式之一。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注