set padrão de pesquisa antes de anexar / substituir várias linhas

1

Eu tenho uma lista de servidores e serviços em execução neles e gostaria de acrescentar o nome do servidor como um prefixo para os seguintes serviços

Considere a seguinte entrada

"SERVER": "us-east-1e-421"
"SERVICES.SNMP.STATUS": "ok"
"SERVICES.NTP.LATENCY": "1.644"
"SERVICES.POSTFIX.STATUS": "ok"
"SERVER": "us-west-1c-353"
"SERVICES.SNMP.STATUS": "ok"
"SERVICES.NTP.STATUS": "ok"
"SERVICES.NTP.LATENCY": "1.541"
"SERVICES.RSYNC.STATUS": "ok"
"SERVICES.NGINX.STATUS": "ok"

Então, o que eu quero é como

us-east-1e-421 SERVICES.SNMP.STATUS ok
us-east-1e-421 SERVICES.NTP.LATENCY 1.644
us-east-1e-421 SERVICES.POSTFIX.STATUS ok
us-west-1c-353 SERVICES.SNMP.STATUS ok
us-west-1c-353 SERVICES.NTP.STATUS ok
us-west-1c-353 SERVICES.NTP.LATENCY 1.541
us-west-1c-353 SERVICES.RSYNC.STATUS ok
us-west-1c-353 SERVICES.NGINX.STATUS ok

Estou bem com o sed básico para uma única linha ou busca / substituição básica e tentei ler alguns dos guias sed publicados antes, por exemplo link mas isso é exagero para o meu conhecimento e precisaria de alguma ajuda

sed '/([a-z]-[a-z]-[a-z0-9]-[0-9])/ N; s/\n"/ /g'

    
por Confu-Sed 09.01.2018 / 17:34

3 respostas

3

Solução alternativa awk :

awk -F': ' '{ gsub(/"/,"") }/SERVER/{ s=$2; next }{ print s, $1, $2 }' file

A saída:

us-east-1e-421 SERVICES.SNMP.STATUS ok
us-east-1e-421 SERVICES.NTP.LATENCY 1.644
us-east-1e-421 SERVICES.POSTFIX.STATUS ok
us-west-1c-353 SERVICES.SNMP.STATUS ok
us-west-1c-353 SERVICES.NTP.STATUS ok
us-west-1c-353 SERVICES.NTP.LATENCY 1.541
us-west-1c-353 SERVICES.RSYNC.STATUS ok
us-west-1c-353 SERVICES.NGINX.STATUS ok
    
por 09.01.2018 / 17:55
1

Com o gnu sed 4.4

sed -E '
/SERVER/{
  s/.* "([^"]*)"//
  h
  d
}
s/[:"]//g
G
s/([^\n]*)\n(.*)/ /
' infile
    
por 10.01.2018 / 05:17
0

Eu usei o comando sed para conseguir o mesmo e funciona bem

  i=$(sed -n '/us-/p' filename  | awk -F ":" '{print $2}' | sed 's/"//g'  | sed -n '1p' | sed '/^$/d' | sed -r "s/\s+//g")

 j=$(sed -n '/us-/p' filename | awk -F ":" '{print $2}' | sed 's/"//g'  | sed -n '2p' | sed '/^$/d' | sed -r "s/\s+//g")

 sed -n "/$i/,/$j/p" filename  | sed '$d'|sed '1d' |sed "s/SERVER//g" | sed 's/"//g' | sed 's/://g'|sed "s/^/$i /g";sed -n "/$j/,/,/p" o.txt  | sed '1d' |sed "s/SERVER//g" | sed 's/"//g' | sed 's/://g'|sed "s/^/$j /g"

saída

us-east-1e-421 SERVICES.SNMP.STATUS ok
us-east-1e-421 SERVICES.NTP.LATENCY 1.644
us-east-1e-421 SERVICES.POSTFIX.STATUS ok
us-west-1c-353 SERVICES.SNMP.STATUS ok
us-west-1c-353 SERVICES.NTP.STATUS ok
us-west-1c-353 SERVICES.NTP.LATENCY 1.541
us-west-1c-353 SERVICES.RSYNC.STATUS ok
us-west-1c-353 SERVICES.NGINX.STATUS ok
    
por 09.01.2018 / 19:14

Tags