2012-09-21 13 views
28

तो मेरे पास bash स्क्रिप्ट है जो सर्वर पर विवरण आउटपुट करती है। समस्या यह है कि मुझे उत्पादन को JSON होने की आवश्यकता है। इस के बारे में जाने के लिए सबसे अच्छा तरीका क्या है? यहाँ bash स्क्रिप्ट है:बैश स्क्रिप्ट से आउटपुट JSON

{"hostname":"server.domain.com", "distro":"CentOS 6.3", "uptime":"5 days, 22 hours, 1 minutes, 41 seconds"} 

धन्यवाद:

# Get hostname 
hostname=`hostname -A` 2> /dev/null 

# Get distro 
distro=`python -c 'import platform ; print platform.linux_distribution()[0] + " " +  platform.linux_distribution()[1]'` 2> /dev/null 

# Get uptime 
if [ -f "/proc/uptime" ]; then 
uptime=`cat /proc/uptime` 
uptime=${uptime%%.*} 
seconds=$((uptime%60)) 
minutes=$((uptime/60%60)) 
hours=$((uptime/60/60%24)) 
days=$((uptime/60/60/24)) 
uptime="$days days, $hours hours, $minutes minutes, $seconds seconds" 
else 
uptime="" 
fi 

echo $hostname 
echo $distro 
echo $uptime 

तो उत्पादन मैं चाहता हूँ कुछ की तरह है।

+6

क्या कोई कारण है कि आप इसे पाइथन से नहीं करना चाहते हैं? मेरा मतलब है, आप इसे किसी भी तरह से उपयोग कर रहे हैं, और पायथन आसानी से होस्टनाम निर्धारित कर सकते हैं, अपटाइम पढ़ सकते हैं, और जेएसओएन जेनरेट कर सकते हैं। – willglynn

उत्तर

55

साथ अपनी स्क्रिप्ट के अंत में अपने तीन echo आदेशों बदलें:

echo -e "{\"hostname\":\""$hostname"\", \"distro\":\""$distro"\", \"uptime\":\""$uptime"\"}" 

-e है के लिए सक्षम बैकस्लैश की व्याख्या निकल जाता

या इस के साथ:

printf '{"hostname":"%s","distro":"%s","uptime":"%s"}\n' "$hostname" "$distro" "$uptime" 

कुछ हाल के डिस्ट्रोज़ में, एक फ़ाइल है: /etc/lsb-release या इसी तरह का नाम (cat /etc/*release)। इसलिए, आप कर सकते थे संभवतः अजगर पर निर्भरता अपने को खत्म:

distro=$(awk -F= 'END { print $2 }' /etc/lsb-release) 

एक अलग रूप में, आप शायद बैकटिक का उपयोग कर के साथ भाग करना चाहिए। वे थोड़ा पुराने हैं।

+11

'printf' थोड़ा क्लीनर होगा: 'printf' {" hostname ":"% s "," distro ":"% s "," uptime ":"% s "} \ n '" $ hostname "" $ distro "" $ uptime "' –

+1

मैंने ऐसा क्यों नहीं सोचा? धन्यवाद ग्लेन :-) – Steve

+0

प्रिंटफ के लिए उपरोक्त क्योंकि यह बीएसडी पर भी काम करता प्रतीत होता है। कम से कम ओएसएक्स में, 'echo' में' -e 'विकल्प नहीं है जो मैं मैन्युअल में देख सकता हूं। –

29

मैं इसे और अधिक json cat का उपयोग कर बनाने के लिए आसान लगता है:

cat <<EOF > /your/path/myjson.json 
{"id" : "$my_id"} 
EOF 
+0

बिल्कुल वही जो मैं खोज रहा था। धन्यवाद – Veera

2

मैं एक पार्टी-निंजा बिल्कुल नहीं हूँ, लेकिन मैं एक समाधान, वह मेरे लिए पूरी तरह से काम करता है लिखा था। इसलिए, मैंने समुदाय के साथ to share it का निर्णय लिया।

सबसे पहले, मैं json.sh

arr=(); 

while read x y; 
do 
    arr=("${arr[@]}" $x $y) 
done 

vars=(${arr[@]}) 
len=${#arr[@]} 

printf "{" 
for ((i=0; i<len; i+=2)) 
do 
    printf "\"${vars[i]}\": ${vars[i+1]}" 
    if [ $i -lt $((len-2)) ] ; then 
     printf ", " 
    fi 
done 
printf "}" 
echo 

नामक एक bash स्क्रिप्ट बनाने और अब मैं आसानी से इसे निष्पादित कर सकते हैं:

$ echo key1 1 key2 2 key3 3 | ./json.sh 
{"key1":1, "key2":2, "key3":3} 
1

@Jimilian स्क्रिप्ट मेरे लिए काफी मददगार था। मैं इसे zabbix auto discovery को डेटा भेजने के कुछ बदल

arr=() 

while read x y; 
do 
    arr=("${arr[@]}" $x $y) 
done 

vars=(${arr[@]}) 
len=${#arr[@]} 

printf "{\n" 
printf "\t"data":[\n" 

for ((i=0; i<len; i+=2)) 
do 
    printf "\t{ "{#VAL1}":\"${vars[i]}\",\t"{#VAL2}":\"${vars[i+1]}\" }" 

    if [ $i -lt $((len-2)) ] ; then 
     printf ",\n" 
    fi 
done 
printf "\n" 
printf "\t]\n" 
printf "}\n" 
echo 

आउटपुट:

$ echo "A 1 B 2 C 3 D 4 E 5" | ./testjson.sh 
{ 
    data:[ 
    { {#VAL1}:"A", {#VAL2}:"1" }, 
    { {#VAL1}:"B", {#VAL2}:"2" }, 
    { {#VAL1}:"C", {#VAL2}:"3" }, 
    { {#VAL1}:"D", {#VAL2}:"4" }, 
    { {#VAL1}:"E", {#VAL2}:"5" } 
    ] 
} 
0

मैं जाओ, json_encode में एक छोटे से कार्यक्रम में लिखा था। यह ऐसे मामलों के लिए बहुत अच्छा काम करता है:

$ ./getDistro.sh | json_encode 
["my.dev","Ubuntu 17.10","4 days, 2 hours, 21 minutes, 17 seconds"] 
संबंधित मुद्दे