编写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
相关产品推荐
相关产品推荐

