我知道它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;
字段进行操作并从中获得有用的东西......418M
12G
以 为例awk
,添加500M
到 10.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