2013-03-13 66 views
0

我想以json形式获得以下小shell脚本的输出。以json形式输出shell脚本

#!/bin/bash 

top -b -d1 -n1 | grep Cpu 

输出:

Cpu(s): 6.2%us, 1.6%sy, 0.2%ni, 90.9%id, 1.1%wa, 0.0%hi, 0.0%si, 0.0%st 

所需的输出:

{"Cpu": "6.3" } 

我如何转换等每一个shell脚本的输出JSON形式?

+0

你期望输出什么? – Kent 2013-03-13 10:16:00

+0

就是这样?只有'“Cpu”“6.2%”'?我建议你在你的问题中为该行添加一个期望输出,以便你可以为你的问题得到正确的答案。 – Kent 2013-03-13 10:34:21

+0

你想要一个bash脚本,说一两行吗? – 2013-03-13 11:00:55

回答

1

你可以试试这个

echo "{\"Cpu\":\"`top -b -d1 -n1 | grep Cpu | cut -f3 -d " " | cut -f1 -d %`\"}" 

简要说明:首先,看看man cut,特别是-f和-d参数。 \"只是双引号,应该在前面加上反斜杠以避免shell解释器的误解。最后,任何用引号括起来的东西都会被执行,如here所述。

+0

有效的Json格式为{“Cpu”:“6.3”},您非常接近所需的输出。 – 2013-03-13 11:18:47

+0

该脚本已更新。我还添加了一些说明,以便您知道这里发生了什么。 – 2013-03-13 11:21:45

+0

工作很棒! – 2013-03-13 11:21:56

0

尝试这一行:

your commands ...|awk 'BEGIN{FS="\\(s\\):\\s*";OFS="";q="\x22" }{$1=q$1q;sub(/%.*$/,"%",$2);$2=q$2q; print $1,$2}' 

测试与您的数据:

kent$ echo "Cpu(s): 6.2%us, 1.6%sy, 0.2%ni, 90.9%id, 1.1%wa, 0.0%hi, 0.0%si, 0.0%st"|awk 'BEGIN{FS="\\(s\\):\\s*";OFS="";q="\x22" }{$1=q$1q;sub(/%.*$/,"%",$2);$2=q$2q; print $1,$2}' 
"Cpu""6.2%" 
+0

它非常接近输出。它给我“Cpu”“6.3%” – 2013-03-13 11:03:08

+0

@ K.KPatel如果你运行'top',这个数字是动态的,它取决于你的CPU负载。 – Kent 2013-03-13 11:05:31

+0

一切都很好。“6.3”之间有一个空格。你只需要一个修改。 – 2013-03-13 11:07:38