从第 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
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.
查看 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