convertendo o arquivo para imprimir apenas o nome do host e o IP

1

Eu preciso converter o seguinte exemplo de arquivo 1 para o arquivo, conforme aparece no exemplo 2

para que ele imprima o nome da máquina e o IP, mas somente no caso de "nome" aparecer antes de host_name

  • redhat03.rdns.com 10.10.29.66 não impresso porque "nome" não aparece antes de host_name

por favor, indique qual é a melhor maneira de fazer esta conversão por awk ou sed ou por perl one liners

exemplo1

    "name" : "REDHAT",
    "host_name" : "linux01.rdns.com",
    "ip" : "10.10.29.61"
    "name" : "REDHAT",
    "host_name" : "linux02.rdns.com",
    "ip" : "10.10.29.62"
    "name" : "REDHAT",
    "host_name" : "linux03.rdns.com",
    "ip" : "10.10.29.63"
    "name" : "REDHAT",
    "host_name" : "redhat01.rdns.com",
    "ip" : "10.10.29.64"
    "name" : "REDHAT",
    "host_name" : "redhat02.rdns.com",
    "ip" : "10.10.29.65"
    "name" : "REDHAT",
    "host_name" : "redhat03.rdns.com",
    "ip" : "10.10.29.66"
    "host_name" : "redhat04.rdns.com",
    "ip" : "10.10.29.67"
    "name" : "REDHAT",
    "host_name" : "redhat05.rdns.com",
    "ip" : "10.10.29.68"
    "name" : "REDHAT",
    "host_name" : "redhat06.rdns.com",
    "ip" : "10.10.29.81"
    "name" : "REDHAT",
    "host_name" : "redhat07.rdns.com",
    "ip" : "10.10.29.82"
    "name" : "REDHAT",
    "host_name" : "redhat08.rdns.com",
    "ip" : "10.10.29.83"
    "name" : "REDHAT",
    "host_name" : "redhat09.rdns.com",
    "ip" : "10.10.29.84"

resultados esperados

 linux01.rdns.com   10.10.29.61
 linux02.rdns.com   10.10.29.62
 linux03.rdns.com   10.10.29.63
 redhat01.rdns.com  10.10.29.64
 redhat02.rdns.com  10.10.29.65
 redhat03.rdns.com  10.10.29.66 
 redhat05.rdns.com  10.10.29.68
 redhat06.rdns.com  10.10.29.81
 redhat07.rdns.com  10.10.29.82
 redhat08.rdns.com  10.10.29.83
 redhat09.rdns.com  10.10.29.84
    
por jango 09.01.2018 / 14:55

4 respostas

0

awk solução:

awk '/ip/ && NR-1==h_num && NR-2==n{ 
         r=h" "$3; gsub(/[,"]+/, "", r); print r 
     }
     /"host_name"/{ h_num=NR; h=$3 }
     /"name"/{ n=NR }' file

A saída:

linux01.rdns.com 10.10.29.61
linux02.rdns.com 10.10.29.62
linux03.rdns.com 10.10.29.63
redhat01.rdns.com 10.10.29.64
redhat02.rdns.com 10.10.29.65
redhat03.rdns.com 10.10.29.66
redhat05.rdns.com 10.10.29.68
redhat06.rdns.com 10.10.29.81
redhat07.rdns.com 10.10.29.82
redhat08.rdns.com 10.10.29.83
redhat09.rdns.com 10.10.29.84
    
por 09.01.2018 / 15:12
0

Seguir awk pode ajudá-lo no mesmo.

awk -F' +|:|,|"' '/"name"/{flag=1;next} flag && /"host_name"/{val1=$(NF-2);next} flag && /"ip"/{print val1,$(NF-1);flag=""}'   Input_file
    
por 09.01.2018 / 15:00
0

Por favor, encontre abaixo o sed oneliner para obter o resultado. Como verificado, seus trabalhos funcionam bem

sed -n '/host_name/,+1p' filename  | awk -F ":" '{print $2}'  | sed 's/"//g' |sed "s/,//g" | sed "N;s/\n/ /g"

saída

linux01.rdns.com  10.10.29.61
 linux02.rdns.com  10.10.29.62
 linux03.rdns.com  10.10.29.63
 redhat01.rdns.com  10.10.29.64
 redhat02.rdns.com  10.10.29.65
 redhat03.rdns.com  10.10.29.66
 redhat04.rdns.com  10.10.29.67
 redhat05.rdns.com  10.10.29.68
 redhat06.rdns.com  10.10.29.81
 redhat07.rdns.com  10.10.29.82
 redhat08.rdns.com  10.10.29.83
 redhat09.rdns.com  10.10.29.84
    
por 09.01.2018 / 15:13
0

Aqui está outra solução para o awk

awk -F'|:|,|"' '/"name"/{getline; printf $5; getline; print "  "$5}' file1
    
por 09.01.2018 / 15:20

Tags