从第 n 列阅读有关使用 awk 的内容

read from the nth column on using awk

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=", "wf_state=", "wf_conn="}')"
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。我如何告诉命令从第 4 列读取而不仅仅是 wf_conn 的第 4 列?

您可以将其余字段“收集”到一个变量中,然后打印它:

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 " "" "r}')

请注意,grep 部分已合并到 awk 中,/wifi[^-]/ 将确保仅打印包含 wifi 后跟除 a 以外的字符的那些行- 个字符。

r=""; for(i=4;i<=NF;i++){r=r (i==4 ? "":" ") $i} 部分初始化一个 r 空字符串,然后使用 space.

连接以字段 4 开头的所有字段

查看 online demo:

#!/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 " "" "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