Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Output JSON from Bash script

Tags:

json

bash

So I have a bash script which outputs details on servers. The problem is that I need the output to be JSON. What is the best way to go about this? Here is the bash script:

# 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 

So the output I want is something like:

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

Thanks.

like image 860
Justin Avatar asked Sep 21 '12 04:09

Justin


2 Answers

If you only need to output a small JSON, use printf:

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

Or if you need to produce a larger JSON, use a heredoc as explained by leandro-mora. If you use the here-doc solution, please be sure to upvote his answer:

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

Some of the more recent distros, have a file called: /etc/lsb-release or similar name (cat /etc/*release). Therefore, you could possibly do away with dependency your on Python:

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

An aside, you should probably do away with using backticks. They're a bit old fashioned.

like image 57
Steve Avatar answered Sep 17 '22 15:09

Steve


I find it much more easy to create the json using cat:

cat <<EOF > /your/path/myjson.json {"id" : "$my_id"} EOF 
like image 20
Leandro Mora Avatar answered Sep 19 '22 15:09

Leandro Mora