Estou tentando analisar alguma saída para que eventualmente eu possa usar declare
para criar múltiplas variáveis de ambiente. O problema que estou encontrando é que a awk
declaração que tenho não está substituindo todas as ocorrências de ponto no primeiro campo ( $1
).
A entrada é gerada a partir de:
etherNIC=$(nmcli --get-values NAME connection show)
nmcli connection show $etherNIC | grep -i "ipv4.gateway\|ipv4.route" > ./ipv4settings.txt
... que se parece com isto:
cat ./ipv4settings.txt
ipv4.gateway: 192.168.2.1
ipv4.routes: --
ipv4.route-metric: -1
ipv4.route-table: 0 (unspec)
Esta é a saída de 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
O problema é que gsub( "\\.", "_", $1 )
não está substituindo todas as ocorrências de .
em $1
. A saída que eu quero é:
ipv4_gateway=192.168.2.1
ipv4_routes=--
ipv4_route_metric=-1
ipv4_route_table=0
Neste caso, o segundo .
foi corretamente substituído por _
.
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>
Edição #1
Acabei de perceber que a saída correta para não ipv4.route-table
deveria ser .0 (unspec)
0
Deixe
file.txt
o conteúdo serObserve que seus campos são separados com
:
o seguinte por pluralidade de caracteres de espaço em branco, em vez de apenas:
. Portanto, proponho a seguinte soluçãodá saída
Explicação: Eu uso
FS
(separador de campo) eOFS
(separador de campo de saída) para informar ao GNUAWK
como os campos são divididos em entrada (FS
) e como devem ser separados em saída (OFS
). Eu usogsub
para substituir o ponto literal ([.]
) usando sublinhado no 1º campo, então eu faço isso$1=$1
para disparar a reconstrução da string caso não haja ponto (ou seja, quandogsub
não houve nada) eprint
a linha inteira.(testado no GNU Awk 5.3.1)
Suposições/entendimentos:
nmcli
saída que começa com as stringsipv4.gateway
ouipv4.route
variable: value
porvariable='value'
variable
devem ser substituídos por sublinhadosvalue
deve ser colocado entre aspas simples; as aspas são necessárias casovalue
incluam espaços em branco (por exemplo,ipv4_route_table='0 (unspec)'
)Uma
awk
ideia:OBSERVAÇÃO:
/^ipvr[.](gateway|route)/
é um exagero quando executado noip4vsettings.txt
arquivo do OP...nmcli
saída bruta para gerar o mesmo resultadoCorrendo contra o arquivo do OP
ipv4settings.txt
:Aplicando à saída bruta da
nmcli
chamada: