You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从bzip2 -v输出中提取指定信息?以获取输入文件大小为例

解决bzip2 -v输出中提取特定信息的问题

我来帮你搞定这个麻烦!首先得搞清楚为什么你之前在gzip上能用的awk命令在bzip2上失效——两者的verbose输出格式不一样,而且bzip2的详细输出是打印到标准错误(stderr)而不是标准输出(stdout),这两个点是核心原因。

先看一下bzip2 -v index.html的典型输出(假设输入文件大小是20字节):

bzip2: index.html: 0.100:1, 20.000 bits/byte, 90.00% saved, 20 in, 2 out.

提取输入文件大小的具体命令

因为输出在stderr,所以需要先把它重定向到stdout才能被awk/sed捕获,然后再提取对应字段:

  1. 用awk提取:
    观察输出的字段拆分,输入大小是第8个字段,所以命令如下:

    bzip2 -v index.html 2>&1 | awk '{print $8}'
    

    执行后会直接输出20,就是你要的输入文件大小数值。

  2. 用sed正则匹配(更灵活):
    如果担心字段位置变化,用正则匹配更可靠,匹配saved,后面的数字:

    bzip2 -v index.html 2>&1 | sed -n 's/.*saved, \([0-9]*\) in.*/\1/p'
    

提取其他信息的通用方法

掌握这个思路后,你可以提取bzip2 -v输出里的任何信息:

  • 提取输出文件大小:对应第10个字段,用awk '{print $10}'
  • 提取压缩率(比如0.100:1):对应第3个字段,awk '{print $3}'
  • 提取保存的百分比:对应第6个字段,去掉百分号可以这么写:
    bzip2 -v index.html 2>&1 | awk '{gsub(/%/,"",$6); print $6}'
    
  • 要是想用正则匹配其他字段,比如提取压缩率,正则可以写:sed -n 's/.*: \([0-9.]*:[0-9]\),.*/\1/p'

关键注意点

一定要记得加上2>&1,把stderr的内容重定向到stdout,否则awk/sed会捕获不到任何输出——这大概率是你之前尝试失败的主要原因!

内容的提问来源于stack exchange,提问作者Travis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:22:02