You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写bash脚本提取df -k磁盘利用率百分比遇阻求助

问题解答

关于正则引擎的差异

没错,POSIX ERE(包括bash里sed使用的扩展正则表达式)确实不支持PCRE那种重复捕获组仅返回最后匹配结果的特性。而且你用sed时拿到整行,核心原因其实是sed默认会输出整个匹配的行,而非只提取捕获组内容——哪怕POSIX正则里重复捕获组最终会保留最后一次匹配的值,你也得通过替换语法让sed只输出捕获的部分,不然它就原样输出整行。

解决方法

方法1:利用df固定列特性(最省心)

df的输出列是固定的,利用率就是第5列(按空格分隔),直接用awk提取最方便:

df -k | awk '{print $5}'

要过滤掉表头的话,加个grep排除:

df -k | grep -v 'Filesystem' | awk '{print $5}'

如果只需要数字(比如91而不是91%),可以去掉百分号:

df -k | grep -v 'Filesystem' | awk '{sub(/%/,"",$5); print $5}'

方法2:调整sed的正则写法

非要用sed的话,不用搞复杂的重复捕获组,直接定位到利用率字段就行。记得加-r启用ERE模式:

echo "/dev/xvda1       8376300 7611164    765136  91% /" | sed -r 's/^.*\s([0-9]+%)\s.*$/\1/'

这个正则的逻辑是:匹配行开头到利用率字段前的所有内容,捕获数字+%的部分,再匹配后面的内容,最后替换成捕获的分组,就能得到利用率值。

方法3:用bash内置字符串处理

不想依赖外部工具的话,用bash的数组分割也能搞定:

line="/dev/xvda1       8376300 7611164    765136  91% /"
# 把行按空格拆成数组
read -ra parts <<< "$line"
# 数组索引从0开始,第5列对应parts[4]
echo "${parts[4]}"

完整脚本示例

要是要实现“利用率超过90%时执行操作”的逻辑,用awk一步到位最便捷:

df -k | grep -v 'Filesystem' | awk '{
    sub(/%/,"",$5)
    if ($5 > 90) {
        print "磁盘" $1 "利用率超标,当前" $5 "%"
        # 这里添加你要执行的操作,比如发送告警、清理文件
        # system("your-command-here")
    }
}'

内容的提问来源于stack exchange,提问作者auspicious99

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 15:23:18