awk中gsub未替换字段内所有句点的问题及解决需求
解析nmcli输出生成环境变量的字符替换问题
问题场景
需要解析nmcli的输出内容,生成可用于declare命令的环境变量定义,但现有awk命令无法完成预期的字符替换,且会截断部分值内容。
输入生成命令
etherNIC=$(nmcli --get-values NAME connection show) nmcli connection show $etherNIC | grep -i "ipv4.gateway\|ipv4.route" > ./ipv4settings.txt
输入文件内容
cat ./ipv4settings.txt ipv4.gateway: 192.168.2.1 ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec)
当前awk命令及输出
cat ./ipv4settings.txt | awk '{ split($0, array, ":") ; gsub( "\\.", "_", $1 ) ; gsub( ":" , "=" , $1 ) ; print $1$2 }'
输出:
ipv4_gateway=192.168.2.1 ipv4_routes=-- ipv4_route-metric=-1 ipv4_route-table=0
期望输出
ipv4_gateway=192.168.2.1 ipv4_routes=-- ipv4_route_metric=-1 ipv4_route_table=0 (unspec)
解决方案
问题根源有两个:
- 原命令仅替换了
.,未处理属性名中的-; - 使用
$1和$2会截断包含空格的取值内容(如0 (unspec))。
改用指定分隔符的方式处理,同时替换所有需要转换的字符:
awk -F': ' '{name=$1; gsub(/[.-]/, "_", name); print name "=" $2}' ./ipv4settings.txt
命令说明
-F': ':将每行按:加空格的组合作为分隔符,把行内容拆分为属性名和取值两部分,确保取值部分完整保留所有内容;gsub(/[.-]/, "_", name):将属性名中的.和-统一替换为_;print name "=" $2:拼接成环境变量定义格式的字符串。
执行该命令后,输出完全符合预期。
内容的提问来源于stack exchange,提问作者aenagy
相关产品推荐
相关产品推荐

