如何从“df -hl”打印磁盘使用百分比

如何从“df -hl”打印磁盘使用百分比

我知道它df -hl会输出所有分区的列表,包括其大小、使用百分比和可用空间。

例如,如果我只想输出 和 的大小和使用情况sda2,我如何告诉 Linux (Ubuntu) 检查它们、对它们求和并向我显示?sda3

答案1

df计算总计,请使用--totals选项。如果您只想计算某些选定驱动器的总计,请将它们指定为参数。

示例(以及我的计算机的输出)

这是所有本地安装的总数:

$ df --total -hl
Filesystem            Size  Used Avail Use% Mounted on
/dev/sdb1              14G   12G  2,1G  85% /
none                  490M  660K  489M   1% /dev
none                  497M  1,5M  495M   1% /dev/shm
none                  497M  260K  496M   1% /var/run
none                  497M     0  497M   0% /var/lock
/dev/sda1             3,7G  418M  3,3G  12% /fastdisk
total                  19G   12G  7,3G  62%

限制为几个驱动器(请注意,如果指定的路径不是精确的安装点,则使用最近的包含安装点【见文末注释】):

$ df -hl --total /home /fastdisk
Filesystem            Size  Used Avail Use% Mounted on
/dev/sdb1              14G   12G  2,1G  85% /
/dev/sda1             3,7G  418M  3,3G  12% /fastdisk
total                  17G   12G  5,3G  69%

或使用dev名称:

$ df -hl --total /dev/sda1 /dev/sdb1
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1             3,7G  418M  3,3G  12% /fastdisk
/dev/sdb1              14G   12G  2,1G  85% /
total                  17G   12G  5,3G  69%

进一步定制

如果要列出除“特殊”安装之外的所有安装,可以使用-x按分区类型排除的选项。 (使用该-T选项来显示类型。)

就我个人而言,为了交互式使用,我使用以下 bash 别名(添加到~/.bash_aliases)来排除“非物理”安装。

alias df='df -h -x devtmpfs -x tmpfs -x debugfs'

笔记

指定挂载点内的路径有时会产生与指定挂载点的确切路径不同的结果。例如,在我的笔记本电脑上,我用来sshfs安装我的(本地)文件服务器。

df -h ~/.server-root/ ~/.server-root/disks/A ~/.server-root/disks/B
Filesystem            Size  Used Avail Use% Mounted on
johan@server:/        185G   58G  118G  33% /home/johan/.server-root
johan@server:/        1,9T  637G  1,2T  35% /home/johan/.server-root
johan@server:/        1,8T  1,1T  757G  59% /home/johan/.server-root

服务器根 ( /) 安装在~/.server-root。然而,在服务器上,磁盘安装在 上/disks/*,而df(在笔记本电脑上)不“知道”这一点。

如果给出正确的路径,显然df可以列出服务器上不同安装的磁盘使用情况。但是,它为所有路径显示相同的“文件系统”和“安装于”,因为(我相信)sshfs这是本地内核挂载表中唯一的挂载点(与此挂载相关)。


另一件事:与问题无关,但与之前的回答到这个问题。

使用脚本(或类似的)将数字相加awk,就像之前发布的一些答案一样,是不是使用标志时是个好主意-h。这是因为需要特殊处理。您不能只对一行和另一行上的size+=$2;字段进行操作并从中获得有用的东西......418M12G

以 为例awk,添加500M10.2G产量

$ echo -e '500M\n10.2G' | awk '{size+=$1;} END{print size;}'
510.2

510.2 什么?

这里显然有问题。所以,只是作为记住的提示,在对输出进行(自动)计算时df (以及其他可以使用“人类可读”数字)。确保你这样做不是使用该-h标志并且计算脚本的输入被标准化(例如字节、块、KB 或其他)并执行以下操作'显示缩放'在最后。在大多数脚本和编程语言中,添加如下内容并不难:

If value < threshold Then
  print (value),"B"
Else If value < 1024*threshold Then
  print (value/1024),"kB"
Else If value < 1024*1024*threshold Then
  print (value/1024/1024),"MB"
(and so on...)

在哪里价值以字节为单位并且临界点是一个大约 1000 的值。此方法的结果是您可以轻松调整它以生成所需范围内的打印值(不包括前缀),并具有您选择的有效数字位数。与带有开关的标准实用程序的情况相比-h,其中格式通常是固定的。

当然,这种计算通常可以变得更加高效和/或优雅,但这是编写它所用的特定语言的问题。坦率地说,如果它用于用户脚本只是偶尔运行以交互方式查看一些信息,效率并不是真正的问题。

答案2

我想你想要两者的size总和use%

 df -hl | grep 'sda2\|sda3' | awk 'BEGIN{print "Size","Use%"} {size+=$2;percent+=$5;} END{print size,percent}' | column -t

答案3

您可以使用如下工具awk

df -hl | awk '/^\/dev\/sd[ab]/ { sum+=$5 } END { print sum }'

在哪里:

  • /^\/dev\/sd[ab]//dev/sda是一种仅过滤以或开头的行的模式/dev/sdb
  • { sum+=$5 }为上述模式的任何匹配添加第五个字段

您可以awk在以下位置找到一些有用的参考资料awk.info 维基

答案4

如果你想要警报,我可以使用 IFTTT、Telegram 和 WebHooks(全部免费)

#!/bin/bash
diskusage=$(df -H | grep -vE '^Filesystem|tmpfs|cdrom|mmcblk0p1' | awk '{ print $5 " " $1 }'| cut -f1 -d '%')
hostname=$(hostname)
tolerance=(85)
date=$(date)

if [[ "$diskusage" -gt "$tolerance" ]]
        then
        echo ""
        echo total disk usage is $diskusage%
        echo ""
        curl -X POST -H "Content-Type: application/json" -d '{"value1":"--Alert--","value2":"Total disk usage is '$diskusage'% ","value3":"Host information: '$hostname' "}' https://maker.ifttt.com/trigger/{alert}/with/key/PutYourKeyHEre
fi
echo ''
echo Disk usage is $diskusage%. The tolerance is $tolerance%. No alert fired $date
echo Disk usage is $diskusage%. The tolerance is $tolerance%. No alert fired $date >> /var/log/IFTTT/checkdiskspace.log

相关内容