在 shell 中使用 TB 单位从 df 命令添加列值

Adding column values from df command with Terabyte units in shell

提问人:waffle418 提问时间:10/31/2023 最后编辑:waffle418 更新时间:11/4/2023 访问量:97

问:

我正在尝试构建一个显示不同文件夹 (f1-f7) 的磁盘大小的表格,如下所示。我还想要一个显示总数的底行。

大小 使用 利用 使用% 安装
F1系列 207 207 0.000462吨 100% 米1
F2 键 227 .223吨 5吨 100% 米2
127 10.223吨 5.000462吨 xx 不适用

“df -h f1 f2” 命令返回:

大小 使用 利用 使用% 安装
F1系列 207 207 462兆字节 100% 米1
F2 键 227 223千兆字节 5吨 100% 米2

到目前为止,我的脚本是:

df -h f1 f2 | awk '!$2{getline x;$0=$0 x}{printf "%-35s %10s %6s %6s %4s %s\n",$1,$2,$3,$4,$5,$6}'

它返回:

大小 使用 利用 使用% 安装
F1系列 207 207 462兆字节 100% 米1
F2 键 227 223千兆字节 5吨 100% 米2

我尝试使用“{total = total + $3}END{print total}”,但它不适合表格格式,并且只添加整数而不包含单位,而不管同一列中具有不同单位的值。如何以 TB 为单位以人类可读格式获得总行数?

Linux Bash 数据帧 外壳 awk

评论

0赞 markp-fuso 10/31/2023
是否还需要生成标头?
0赞 markp-fuso 10/31/2023
请使用df -h f1 f2
0赞 waffle418 10/31/2023
您好,感谢您的帮助@mandy8055!我在“awk: cmd: line:5: !\2 {”上收到错误,说“^ 反斜杠不是行上的最后一个字符”。我该如何解决这个问题?
0赞 markp-fuso 10/31/2023
请更新预期输出以显示实际总值(即,将 替换为实际值);(对我来说)不清楚是否应该显示为 or or 或其他东西;x's10T + 6.2G10.0062T10006.2G10,006G
1赞 karakfa 11/1/2023
df命令用于文件系统,而不是目录大小。如果文件夹位于同一文件中,则总数将毫无意义。还提供选项,可以做您可能想要的事情。df--total

答:

1赞 stuffy 11/4/2023 #1

你能试试这个吗

echo "        Size    Used    Avail   Use%    Mount
f1      10T     10T     462MB   100%    m1
f2      12T     223GB   5T      100%    m2" | awk '
BEGIN {
        OFS = "\t"
}

NR == 1 {
        $1 = $1
        print "", $0
        next
}

{
        for (i = 2; i <= 4; i++) {
                if ($i ~ /T/) {
                        total[i] = total[i] + $i
                        scale[i] = scale[i] > 0 ? scale[i] : 0
                }
                if ($i ~ /G/) {
                        $i = ($i / 1000) "T"
                        total[i] = total[i] + ($i / 1000)
                        scale[i] = scale[i] > 3 ? scale[i] : 3
                }
                if ($i ~ /M/) {
                        $i = ($i / 1000 / 1000) "T"
                        total[i] = total[i] + ($i / 1000 / 1000)
                        scale[i] = scale[i] > 6 ? scale[i] : 6
                }
        }
        print $0
}

END {
        printf "Total" OFS
        for (i = 2; i <= 4; i++) {
                printf "%0.*fT%s", scale[i], total[i], OFS
        }
        print "xx" OFS "N/A"
}

哪里

  • 回显显示您的输入
  • OFS = “\t” 使用 tab 作为输出分隔符
  • NR == 1 和 $1=$1 表示重新格式化标题并按原样打印
  • for(i=2;i<=4;i++) 我们看第 2、3 和 4 个值
  • 然后我们查找 T 或 G 或 M,然后重新格式化当前值并更新数组中的总计,并跟踪要显示的小数位数
  • END 块,我们打印出总线

我得到这个输出

        Size    Used    Avail   Use%    Mount
f1      10T     10T     0.000462T       100%    m1
f2      12T     0.223T  5T      100%    m2
Total   22T     10.223T 5.000462T       xx      N/A