我正在尝试获取系统中给定磁盘的使用率百分比。我必须编写的程序将是一个bash
shell 脚本。该脚本必须适用于 Debian、Arch 和 Mac OS X。
我目前的方法是执行 adf
和 grep 来获取使用率百分比。问题是这些系统上的输出df
不同。我想if os==Arch elseif os == Debian…
尽可能避免这种情况。
是否有一种解决方案可以避免区分操作系统?
每个操作系统/版本的示例输出df
:
苹果
Filesystem 512-blocks Used Available Capacity iused ifree %iused Mounted on
/dev/disk2 179032136 106162416 72357720 60% 13334300 9044715 72% /
Debian
Filesystem 1K-blocks Used Available %used Mounted on
/dev/hdv1 20480000 8423436 11016564 44% /
拱
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/root 5160576 813420 4085012 17% /
所以 Arch 和 Debian 是差不多的。标签可能用不同的语言打印,这也可能是问题。
答案1
这应该适用于所有三个df
输出:
df | awk '/\//{print $1,$(NF-1)}'
这是您发布的每个示例的输出:
/dev/disk2 72%
/dev/hdv1 44%
/dev/root 17%
解释:
该awk
命令查找包含的行/
(因此忽略标题)并打印第一个($1
)和倒数第二个($(NF-1)
)字段。如果您想要仅有的使用百分比,请执行以下操作:
df | awk '/\//{print $(NF-1)}'
更新:
我上面的回答将为您提供%iused
Macdf
输出上的字段。如果您想要的是Capacity
,请执行以下操作(再次适用于所有三个):
df | perl -ne '/\// && do {/(.+?)\s.+?(\d+%)/ && print "$1 $2\n"}'
它还打印第一个字段(非贪婪的(.+?)
,以 终止\s
)和第一的百分比数字((\d+%)
,前面是非贪婪的.+?
)。
答案2
一个稍微复杂但可能更通用的解决方案是
df | sed -n 's/^\([^ ]*\) .*[^0-9]\([0-9]*%\).*/\1 \2/p'
它显示行中的第一个“单词”(文件系统设备名称),然后查找数字序列,后跟一个%
。具体来说,它查找最后的这样的字符串。
[哎呀:它还会显示标题的混乱子集(即第一行,带有列标题)。]
更新:
df | sed -n 's/^\([^ ]*\) .*[^0-9]\([0-9][0-9]*%\).*/\1 \2/p'
修复标题行的问题,并且
df | sed -n 's/^\([^ ]*\) [^%]*[^0-9]\([0-9][0-9]*%\).*/\1 \2/p'
捕获第一的百分比数字字段。具体来说,在 Mac 上,这将捕获Capacity
列而不是%iused
列。