使用awk如何读取指定第N列及之后的全部字段内容?
解决方案
你可以修改awk的逻辑,将第4列开始的所有字段拼接为完整的连接名,修改后的命令如下:
wf_info="$(nmcli -c no device | grep "wifi[^-]" | awk '{conn=""; for(i=4;i<=NF;i++) conn=conn" "$i; gsub(/^ /,"",conn); print "wf_devc="$1, "wf_state="$3, "wf_conn=\""conn"\""}')" eval "$wf_info"
改动说明
- awk内部新增循环从第4个字段遍历到最后一个字段
NF(NF是awk内置变量,表示当前行总字段数),把所有内容拼接成完整的连接名 - 用
gsub去掉拼接后开头多余的空格 - 给
wf_conn的值加上双引号,避免eval的时候空格被当做分隔符处理
你也可以用更稳妥的方案,避免使用eval,直接分别赋值:
# 先过滤出wifi设备行 wifi_line=$(nmcli -c no device | grep "wifi[^-]") wf_devc=$(echo "$wifi_line" | awk '{print $1}') wf_state=$(echo "$wifi_line" | awk '{print $3}') wf_conn=$(echo "$wifi_line" | awk '{for(i=4;i<=NF;i++) printf "%s ",$i; print ""}' | sed 's/ *$//')
这种方案不需要eval,也不会有空格解析的问题。
验证
执行后输出变量可以得到完整的连接名:
echo "$wf_devc" # 输出 wlp3s0 echo "$wf_state" # 输出 connected echo "$wf_conn" # 输出 My Test Connection
内容的提问来源于stack exchange,提问作者nino
相关产品推荐
相关产品推荐

