如何在Shell脚本中提取nmcli输出的Wi-Fi SECURITY字段?
从nmcli提取SSID对应的SECURITY字段的实用方法
没问题,我来帮你搞定这个需求!其实nmcli本身就支持更易脚本处理的输出格式,不用依赖带分隔线的表格模式(也就是去掉-p参数),这样提取字段会简单很多。下面给你两种靠谱的实现方式:
方法1:用简洁模式(Terse Mode)+ awk(推荐)
这种方式直接指定nmcli只输出你需要的SSID和SECURITY字段,输出格式紧凑,完全不用担心SSID带空格的问题:
nmcli -t -f SSID,SECURITY dev wifi list | awk -F ':' '{print "SSID: " $1 " | SECURITY: " $2}'
参数解释:
-t:启用terse模式,输出内容用冒号分隔,没有多余的格式(比如表格线、重复表头),非常适合脚本解析-f SSID,SECURITY:指定只输出SSID和SECURITY两个字段,减少不必要的数据处理awk -F ':':用冒号作为分隔符,直接提取第一列(SSID)和第二列(SECURITY)
方法2:处理完整表格输出(适合需要保留其他字段的场景)
如果你需要保留nmcli的完整表格输出,再从中提取目标字段,可以用awk处理SSID含空格的情况(因为SSID可能包含空格,不能直接用固定列数提取):
nmcli dev wifi list | awk 'NR>1 { # 从第3列到倒数第2列拼接成SSID(跳过IN-USE、BSSID,直到BARS列之前) ssid = "" for(i=3; i<=NF-1; i++) { ssid = ssid $i " " } # 去掉末尾多余的空格,然后输出SSID和最后一列的SECURITY print "SSID: " substr(ssid, 1, length(ssid)-1) " | SECURITY: " $NF }'
说明:
NR>1:跳过第一行的表头- 循环拼接SSID:因为
nmcli的表格列顺序是IN-USE BSSID SSID MODE CHAN RATE SIGNAL BARS SECURITY,所以SSID从第3列开始,到倒数第2列(BARS)结束,最后一列就是SECURITY
额外提示:避免用-p参数
-p参数是让nmcli输出带分页的格式化表格,会包含大量分隔线和重复表头,反而增加解析难度,所以脚本里建议直接去掉这个参数,用上面的两种方式更高效。
内容的提问来源于stack exchange,提问作者flowero
相关产品推荐
相关产品推荐

