2012-09-21 215 views
28

因此,我有一個bash腳本,它在服務器上輸出詳細信息。問題是我需要輸出爲JSON。什麼是最好的方式去做這件事?下面是bash腳本:從Bash腳本輸出JSON

# 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 

所以我想輸出是一樣的東西:

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

感謝。

+6

是否有一個原因,你不想從Python做到這一切?我的意思是,無論如何你都在使用它,Python可以很容易地確定主機名,讀取正常運行時間並生成你想要的JSON。 – 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)。因此,你可以可能破除依賴你的Python的:

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

順便說一句,你應該使用反引號之事。他們有點老式。

+11

'printf'會更清潔一點:'printf'{「hostname」:「%s」,「distro」:「%s」,「uptime」:「%s」} \ n'「$ hostname」「$發行「」$正常運行時間「' –

+1

爲什麼我沒有想到這一點?感謝Glenn :-) – Steve

+0

Upvote for printf,因爲它似乎也適用於BSD。至少在OSX中,'echo'沒有我在手冊中看到的'-e'選項。 –

29

我覺得它更容易創建使用cat的JSON:

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

正是我在找的東西。謝謝 – Veera

2

我不是一個bash忍者可言,但我寫了一個解決方案,完美的作品對我來說。所以,我決定與社區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"]