RPM和AWK无法直接生成热力图,但可统计各包安装后文件总大小并排序,输出结构化数据供gnuplot、Python等工具绘图;关键步骤是rpm -ql结合stat计算实际磁盘占用。

直接用 rpm -qa --queryformat 配合 awk 无法生成“热力图”——因为热力图是可视化图形,而 RPM 和 AWK 是命令行文本处理工具,不支持绘图。但你可以用它们完成**关键前置步骤**:统计每个已安装 RPM 包的磁盘占用(即所有文件总大小),并按大小排序输出,为后续绘图提供结构化数据。
一、获取每个 RPM 包的物理文件总大小
RPM 包本身(.rpm 文件)不等于其安装后占用的空间。真正要统计的是包安装后在系统中创建的所有文件的磁盘占用。可用以下命令安全获取:
注意:需 root 权限;部分包含大量小文件时速度较慢;建议先测试小范围(如 rpm -q bash)
rpm -qa --queryformat '%{NAME} %{PACKAGEORIGIN}\n' | while read name origin; do<br> files=$(rpm -ql "$name" 2>/dev/null | grep -v '^$' | grep -v '^(none)$');<br> if [ -n "$files" ]; then<br> size=$(echo "$files" | xargs -r stat -c '%s' 2>/dev/null | awk '{sum += $1} END {print sum+0}');<br> echo "$name $size";<br> else<br> echo "$name 0";<br> fi;<br>done | sort -k2,2nr | head -50
二、优化版单行命令(推荐用于导出数据)
更健壮、可重定向到文件供后续分析:
rpm -qa --queryformat '%{NAME}\n' | xargs -r -I{} sh -c 'echo -n "{} "; rpm -ql "{}" 2>/dev/null | grep -v "^$" | xargs -r stat -c "%s" 2>/dev/null | awk "{sum+=$1} END {print sum+0}"' | awk ' > 0' | sort -k2,2nr > rpm-sizes.txt
-
rpm -ql列出包内所有文件路径 -
stat -c "%s"获取每个文件字节数(跳过符号链接和缺失路径) -
awk '{sum+=$1} END {print sum+0}'累加求和,空输入返回 0 -
awk '$2 > 0'过滤掉无文件或统计失败的包(避免干扰)
三、生成可导入绘图工具的数据格式
热力图通常需要二维分布(例如:包大小 vs 类别 / 安装时间 / 依赖深度)。纯大小排序只是线性排名。若真要“热力图”,可构造简单二维指标:
- 横轴:包大小区间(如每 1MB 一档)
- 纵轴:包数量(直方图式热力)→ 实际是柱状图密度,常用
gnuplot或 Python 绘制 - 或用包名首字母分组(A–Z)为 Y 轴,大小为 X 轴 → 得到字符级粗粒度热力
示例(按大小分桶计数,适合 gnuplot):
awk '{bucket=int($2/1048576); count[bucket]++} END {for (b in count) print b, count[b]}' rpm-sizes.txt | sort -n > size-buckets.dat
四、真正绘图:交给专业工具
把 rpm-sizes.txt 或 size-buckets.dat 导入以下任一工具即可生成热力图:
-
Python + matplotlib/seaborn:读取
rpm-sizes.txt,用plt.hist2d或sns.heatmap(需构造矩阵) -
gnuplot:
plot 'size-buckets.dat' with image -
R(ggplot2):用
geom_tile()或geom_raster() - Excel / LibreOffice Calc:导入后用“条件格式 → 色阶”模拟简易热力效果
不复杂但容易忽略:RPM 自身不存文件大小元数据,必须通过 rpm -ql + stat 实时计算——这是唯一准确方式。没有捷径,也没有内置热力图开关。











