我正在尝试解析一些输出,以便最终可以用来declare
创建多个环境变量。我遇到的问题是,awk
我的语句没有替换第一个字段 ( $1
) 中的所有句点。
输入来自:
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
问题是gsub( "\\.", "_", $1 )
不能替换.
中的所有出现$1
。我想要的输出是:
ipv4_gateway=192.168.2.1
ipv4_routes=--
ipv4_route_metric=-1
ipv4_route_table=0
在这种情况下,第二个.
已被正确替换为_
。
awk --version
GNU Awk 5.1.0, API: 3.0 (GNU MPFR 4.1.0-p9, GNU MP 6.2.0)
Copyright (C) 1989, 1991-2020 Free Software Foundation.
<snip>
编辑#1
我刚刚意识到的正确输出ipv4.route-table
应该0 (unspec)
不是0
。
让
file.txt
内容成为:
请注意,您的字段与以下字段之间由多个空格字符分隔,而不是单个:
。因此,我建议使用以下解决方案给出输出
解释:我使用
FS
(字段分隔符)和OFS
(输出字段分隔符)来通知 GNUAWK
字段在输入()中如何剪切FS
以及在输出()中应如何分隔OFS
。我使用下划线gsub
替换[.]
第一个字段中的文字点(),然后我这样做$1=$1
是为了在没有点(即gsub
什么都不做)和print
整行的情况下触发字符串重建。(在 GNU Awk 5.3.1 中测试)
假设/理解:
nmcli
的输出感兴趣ipv4.gateway
ipv4.route
variable: value
为variable='value'
variable
将被替换为下划线value
必须用单引号引起来;如果value
包含空格,则需要使用引号(例如ipv4_route_table='0 (unspec)'
)一个
awk
想法:笔记:
/^ipvr[.](gateway|route)/
在针对 OP 的ip4vsettings.txt
文件运行时则显得有些过度......nmcli
输出输入到同一脚本中以生成相同的结果针对 OP 的
ipv4settings.txt
文件进行运行:应用于调用的原始输出
nmcli
: