我正在编写 shell 脚本来计算用户主目录总磁盘大小的 15%。我有这个命令,它(某种程度上)可以让我得到我想要的东西,但不确定是否有更好的方法来实现这一点。
df -hT /home/user1 | grep -vE '^Filesystem' | awk '{ print $2 }'
该命令输出:
<blank line>
516G
我的问题是,如何提取 516,这个命令是否是正确的方法。
答案1
不使用 grep 的另一种方法是awk
:
df -hT /home/user | awk '$1 ~ "sda1"{gsub(/[A-Z]/,"",$4); print $4}'
awk 块前面的测试$1~"sda1"
只是检查您的主硬盘是否是df
正在查看的硬盘。这比抓取df
不包含以下内容的记录要安全得多filesystem
,如果您将另一个驱动器放入盒子中或安装一些 NFS 驱动器,则可能吐出不仅仅是您的主驱动器的内容。
gsub(/[A-Z]/, "", $4)
$4
只需将(驱动器大小)中的任何大写字母替换为空""
即可。这应该足够了,因为我相信所有磁盘大小后缀 (K、M、G 等) 都是大写字母。完成后,我们打印新的和改进的$4
。
答案2
- 用
$2+0
使其成为 中的数字awk
。 - 您不需要这样做,
grep
因为您可以自行执行搜索awk
。
您可以使用:
df -hT / | awk '/^Filesystem/{ print ($2+0) * 15/100 }'
答案3
我建议你不要尝试删除“G”,而是指定块大小。这将确保你不必处理返回类似以下内容的复杂情况米或者钾:
df -BG /home/user1 | awk 'NR==2 { print $3 * 0.15 }'
也许使用 -B1 更好,然后手动执行可打印的版本:
df -B1 /home/user1 | awk 'NR==2 { split("K M G T P E", s); for(n=int($3*0.15); n>1024; n=rshift(n,10)) i++; print n s[i] }'
以上内容适用于(GNU coreutils)8.12 和 8.25 版本df
。
输出df
提供了有关给定目录使用的分区的信息...如果您的每个用户都拥有自己的分区,那么这可能会很有效。但是,在大型组织中,尤其是在您的用户目录中更有可能使用该分区。如果是这种情况,quota
请查阅(和朋友)man
的页面。quota