从Bash脚本输出JSON

时间:2012-09-21 04:51:01

标签: json bash

所以我有一个bash脚本输出服务器的详细信息。问题是我需要输出为JSON。最好的方法是什么?这是bash脚本:

# 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"}

感谢。

7 个答案:

答案 0 :(得分:71)

使用以下命令替换脚本末尾的三个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)

除此之外,你应该放弃使用反引号。他们有点老式。

答案 1 :(得分:43)

我发现使用cat

创建json要容易得多
cat <<EOF > /your/path/myjson.json
{"id" : "$my_id"}
EOF

答案 2 :(得分:3)

我根本不是一个bash-ninja,但是我写了一个解决方案,对我来说非常合适。所以,我决定to share it与社区。

首先,我创建了一个名为app:statusBarScrim="@color/transparent"

的bash脚本
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

答案 3 :(得分:1)

@pimilian脚本对我很有帮助。我将其更改为zabbix auto discovery

ct.MaturityDate < dateadd(dd, 30,getdate())

输出:

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

答案 4 :(得分:1)

我在Go,json_encode写了一个小程序。它对这种情况非常有用:

$ ./getDistro.sh | json_encode
["my.dev","Ubuntu 17.10","4 days, 2 hours, 21 minutes, 17 seconds"]

答案 5 :(得分:0)

data=$(echo  " BUILD_NUMBER : ${BUILD_NUMBER} , BUILD_ID : ${BUILD_ID} , JOB_NAME : ${JOB_NAME} " | sed 's/ /"/g')

output => data="BUILD_NUMBER":"29","BUILD_ID":"29","JOB_NAME":"OSM_LOG_ANA"

答案 6 :(得分:0)

要回答主题行,如果您需要从任何命令行获取制表符分隔的输出,并且需要将其格式化为 JSON 列表列表,您可以执行以下操作:

echo <tsv_string> | python3 -c "import sys,json; print(json.dumps([row.split('\t') for row in sys.stdin.read().splitlines() if True]))

例如,获取一个 zfs 列表输出为 json:

zfs list -Hpr -o name,creation,mountpoint,mounted | python3 -c "import sys,json; print(json.dumps([row.split('\t') for row in sys.stdin.read().splitlines() if True]))