Bash如何简便提取netstat -m输出的指定值并赋值给变量
简洁实现方案
你原来的多层字符串截取逻辑完全可以简化,下面是几种更易读、更简洁的写法,优先推荐用关键词匹配的方式取数,避免因为输出行序、空行变化导致取值错误:
方案1:awk 一行实现(最推荐)
不需要预先存储全部命令输出,直接通过管道匹配目标行提取数值,兼容性最好:
mbuf=$(netstat -m | awk -F'/' '/mbuf clusters in use/ {print $3}')
逻辑说明:
-F'/'指定斜杠为字段分隔符/mbuf clusters in use/精准匹配到mbuf集群统计的目标行,不用硬编码行号- 目标行按斜杠拆分后,第三个字段正好是你需要的total值5866,直接输出赋值即可
方案2:纯Bash内置语法(无外部命令依赖)
如果不想调用awk、grep这类外部工具,可以优化你原来的参数展开逻辑,通过固定关键词定位减少截取步骤:
mbuf_stat=$(netstat -m) # 先截到目标关键词之后的内容 mbuf=${mbuf_stat#*mbuf clusters in use} # 去掉最后一个斜杠之后的所有内容 mbuf=${mbuf%/*} # 保留最后一个斜杠之后的内容,就是目标值 mbuf=${mbuf##*/}
方案3:read 按分隔符直接拆分
利用Bash的read命令按指定分隔符拆分字段,一行完成赋值:
IFS='/' read -r _ _ mbuf _ < <(netstat -m | grep -m1 "mbuf clusters in use")
逻辑说明:将斜杠设为字段分隔符,读取匹配到的目标行时,前两个字段存入临时变量_丢弃,第三个字段直接存入mbuf变量,后续字段也统一丢弃。
避坑提示:不要用「取第二行」的逻辑写死行号,不同操作系统、不同内核版本的
netstat -m输出前的空行数量、统计项顺序可能存在差异,通过固定关键词匹配目标行的写法稳定性高很多。
内容的提问来源于stack exchange,提问作者TheCyberfreak
相关产品推荐
相关产品推荐

