nmcli -c no device
显示:
DEVICE TYPE STATE CONNECTION
wlp3s0 wifi connected My Test Connection
p2p-dev-wlp3s0 wifi-p2p disconnected --
enp4s0f1 ethernet unavailable --
lo loopback unmanaged --
为了在wifi上分离信息,我有这个命令:
wf_info="$(nmcli -c no device | grep "wifi[^-]" | awk '{print "wf_devc="$1, "wf_state="$3, "wf_conn="$4}')"
eval "$wf_info"
echo "$wf_devc" # returns wlp3s0
echo "$wf_state" # returns connected
echo "$wf_conn" # returns My (while should be My Test Connection)
上面命令的问题是,对于wf_conn,它给了我My
,而我应该是全名My Test Connection
。我怎样才能告诉命令从wf_conn的第4列读取,而不仅仅是从第4列读取?
你可以"collect"将其余字段放入单个变量中,然后打印出来:
read wf_devc wf_state wf_conn < <(nmcli -c no device | awk '/wifi[^-]/{r=""; for(i=4;i<=NF;i++){r=r (i==4 ? "":" ") $i}; print $1" "$3" "r}')
注意grep
部分被合并到awk
中,/wifi[^-]/
将确保只打印那些包含wifi
后面跟着一个字符而不是-
字符的行。
r=""; for(i=4;i<=NF;i++){r=r (i==4 ? "":" ") $i}
部分初始化一个r
空字符串,然后所有以Field 4开头的字段使用空格连接。
查看在线演示:
#!/bin/bash
s='DEVICE TYPE STATE CONNECTION
wlp3s0 wifi connected My Test Connection
p2p-dev-wlp3s0 wifi-p2p disconnected --
enp4s0f1 ethernet unavailable --
lo loopback unmanaged --'
read wf_devc wf_state wf_conn < <(awk '
/wifi[^-]/{
r="";
for(i=4;i<=NF;i++){
r=r (i==4 ? "":" ") $i
};
print $1" "$3" "r
}' <<< "$s")
echo "wf_devc=$wf_devc wf_state=$wf_state wf_conn=$wf_conn"
输出:
wf_devc=wlp3s0 wf_state=connected wf_conn=My Test Connection