使用awk从第n列读取



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

相关内容

  • 没有找到相关文章

最新更新