2016-04-05 6 views
1

Eingang zu schaffen: dass Bash-Skript eine JSON-Datei

10.204.99.15 10.204.99.12 10.204.99.41 

Diese kann Ich habe einen Dateinamen namens ‚myseedips‘ mit einer Reihe von IP-Adressen in ihr in der unten gezeigten Struktur

‚n‘ Anzahl der IP-Adressen Zeile für Zeile.

Ausgabe Ich habe keine Ahnung auf bash Programmierung. Aber ich muss ein Bash-Skript schreiben, um eine JSON-Datei in der folgenden Struktur zu erstellen. Diese IP-Adressen müssen sich in einer Schleife befinden, so dass sich der JSON abhängig von der Länge der myseedips-Datei ändert/erweitert.

"cassandra": { 
     "nodes": [ 
     {"ip_address": "10.204.99.15","type": "seed"}, 
     {"ip_address": "10.204.99.12","type": "seed"}, 
     {"ip_address": "10.204.99.41","type": "seed"}] 
    }, 

müssen auch Logik hinzufügen Komma am Ende jedes Knotens für alle Knoten mit Ausnahme des letzten hinzuzufügen. Hängen Sie kein Komma an, wenn nur ein Knoten vorhanden ist.

Beispiel: Kann etwas wie die unten Code-Logik sein, aber in Bash-Programmierung.

j string 
j = `"cassandra": {"nodes": [` 
for i =0;i<len(ips);i++ { 
    j = j + `{"ip_address": "` + ips[i] + `","type": "seed"},` 
} 
j = j + `}]}` 

Dank Nissar Sheik

Antwort

1

Mit jq, erhalten Sie einen zusätzlichen Pass benötigen aus Rohtext zu einer praktikablen Array zu konvertieren, aber einfach:

$ jq -R '.' myseedips | jq -s '{cassandra:{nodes:map({ip_address:.,type:"seed"})}}' 

Die folgenden ergeben:

{ 
    "cassandra": { 
    "nodes": [ 
     { 
     "ip_address": "10.204.99.15", 
     "type": "seed" 
     }, 
     { 
     "ip_address": "10.204.99.12", 
     "type": "seed" 
     }, 
     { 
     "ip_address": "10.204.99.41", 
     "type": "seed" 
     } 
    ] 
    } 
} 
+0

Thant eine ausgezeichnete Antwort jeff. Das hat funktioniert. Danke, – Nissar

+0

Jeff, würden Sie auch etwas dagegen tun, meine noch eine Frage in dieser Schleife zu beantworten – Nissar

0

awk zur Rettung!

eine Vorlage awk Lösung kann

$ awk 'BEGIN{print "header"} 
    NR==FNR{c=NR;next} 
      {print "prefix",$1,"suffix" (FNR<c?",":"]")} 
     END{print "footer"}' myseedips{,} 

header 
prefix 10.204.99.15 suffix, 
prefix 10.204.99.12 suffix, 
prefix 10.204.99.41 suffix] 
footer 

sind Sie den Header ersetzen können, Footer, Präfix und Suffix.

0

Zusätzlich zu Jeffs Antwort, Bitte beachten Sie, dass die Transformation mit einem einzigen Aufruf von jq durchgeführt werden kann. Wenn Ihr jq den inputs Filter:

jq -Rn '[inputs] | {cassandra:{nodes:map({ip_address:.,type:"seed"})}}' 

Ansonsten:

jq -Rs 'split("\n") | {cassandra:{nodes:map({ip_address:.,type:"seed"})}}' ips.txt