我一直在为我的问题寻找解决方案,但没有找到一个或更好的答案--我发现的是我没有得到答案。我的问题是:我在树莓Pi上使用智能家庭控制软件( Smart Home Control Software )。使用pilight-receive,我可以从我的室外温度传感器捕捉数据。pilight接收的输出看起来是这样的:
{
"message": {
"id": 4095,
"temperature": 409.5
},
"origin": "receiver",
"protocol": "alecto_wsd17",
"uuid": "0000-b8-27-eb-0f3db7",
"repeats": 3
}
{
"message": {
"id": 1490,
"temperature": 25.1,
"humidity": 40.0,
"battery": 1
},
"origin": "receiver",
"protocol": "alecto_ws1700",
"uuid": "0000-b8-27-eb-0f3db7",
"repeats": 3
}
{
"message": {
"id": 2039,
"temperature": 409.5
},
"origin": "receiver",
"protocol": "alecto_wsd17",
"uuid": "0000-b8-27-eb-0f3db7",
"repeats": 4
}现在,我的问题是:如何从id为1490的消息中提取温度和湿度?您建议我如何经常检查?通过一个cron作业,每10分钟运行一次,创建pilight-receive的输出,提取输出的数据并将其推送到智能家庭控制API?
发布于 2015-11-17 02:43:22
对于那些不懂高级awk的人(比如像我这样的人)和没有预装jq的人来说,一个简单的解决方案是将几个本机命令组合起来,如下所示:
grep -A2 '"id": 1490,' stats.json | sed '/1490/d;s/"//g;s/,//;s/\s*//'grep比使用awk或sed:更容易
grep -A2 '"id": 1490,' stats.json | grep -o "[0-9]*\.[0-9]*"为了提供一个解释,这似乎是我最简单的方法。
grep -A2获取您在JSON中寻找的行,以及包含温度和湿度的以下2行。grep -o的管道只打印由.分隔的数字数字(这永远不会发生在第一条1490线上,因此留下了两个值--温度和湿度)。非常简单。在我看来,甚至比使用jq更简单。发布于 2021-07-12 07:21:35
要使用id 1490从每条消息中获取温度和湿度,可以使用以下选项卡分隔列表:
jq -r '.message | select(.id == 1490) | [ .temperature, .humidity ] | @tsv' 给定问题中的数据的输出:
25.1 40要获得CSV输出,添加一个标头,请使用
jq -s -r '[ "temperature", "humidity" ], (.[] | .message | select(.id == 1490) | [ .temperature, .humidity ]) | @csv' 注意这里添加的-s在"slurp模式“中使用jq。它将输入集中的所有对象读入一个数组中,我们使用这个数组首先将@csv操作符CSV头作为数组,然后给出一组包含我们从数据中提取的各个CSV记录的数组。
给定问题中的数据的输出:
"temperature","humidity"
25.1,40https://unix.stackexchange.com/questions/243428
复制相似问题