shell - 使用awk计算磁盘空间

标签 shell unix awk

我正在尝试使用此脚本计算 UNIX (Solaris) 主机上的总磁盘空间,但我必须使用 awk 两次。有更好的方法吗?

> root# iostat -En | grep ^Size 
Size: 146.81GB <146810536448 bytes>     
Size: 0.00GB <0 bytes> 
Size: 107.37GB <107374182400 bytes> 
Size: 107.37GB <107374182400 bytes>
Size: 107.37GB <107374182400 bytes> 
Size: 107.37GB <107374182400> bytes>
Size: 21.47GB <21474836480 bytes>

这是我正在应用的 awk 语法:

    # iostat -En | grep ^Size | awk '{print $2}' | cut -d"G" -f1  | awk '{sum+=$1} END {print sum}'

> 29412.7

我们是否可以添加一个缩放器以使值具有更好的十进制表示格式?

最佳答案

awk 将选择 ^Size行(消除 grep )并删除 G为您服务:

iostat -En | awk '/^Size/{sum+=$2} END {print sum}'
361.55

表达式sum+=$2强制 awk 将第二个字段视为数字。这意味着字母字符被删除。

更准确的计算

iostat 中的第三个字段输出似乎包含实际字节。这样就无需转换千兆字节、兆字节等。要使用此字段:

iostat -En | awk -F'[ \t<>]+' '/^Size/{sum+=$3} END {printf "%sGB\n", sum/1e9}'
361.559GB

选项-F'[ \t<>]+'告诉 awk 将空格、制表符或尖括号的任意组合视为字段分隔符。这具有删除 < 的效果。和>从第三个字段开始,这样第三个字段就可以直接被当作一个数字。

有关 awk 变量转换的更多信息

可以使用以下命令直接测试 awk 从字符串到数字的转换:

$ echo '132G' | awk '{print $1+0}'
132
$ echo '<132G' | awk '{print $1+0}'
0

在后一种情况下,<导致数字转换失败。这就是为什么在上面的代码中更改了字段分隔符以删除 <来自田野。

关于shell - 使用awk计算磁盘空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32491945/

相关文章:

c++ - pthread_key_t 和 pthread_once_t?

go - 如何在go中检查文件是否可执行?

awk - 如何折叠数据文件中带有零的字段

python - 查找大型文本文件中是否存在一组行

Linux tc(流量控制)工具 - 配置后 ssh 连接问题

c++ - 如何找到 "my"lib目录?

bash - 如何使用 bash 或 awk 对多个文件中的矩阵求和

linux - shell找不到nginx

bash - Docker拒绝运行bash

linux - awk split 将整个字符串添加到数组位置 1(原因未知)