首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从JSON文件中提取数据

如何从JSON文件中提取数据
EN

Unix & Linux用户
提问于 2015-11-16 21:26:01
回答 2查看 110.8K关注 0票数 27

我一直在为我的问题寻找解决方案,但没有找到一个或更好的答案--我发现的是我没有得到答案。我的问题是:我在树莓Pi上使用智能家庭控制软件( Smart Home Control Software )。使用pilight-receive,我可以从我的室外温度传感器捕捉数据。pilight接收的输出看起来是这样的:

代码语言:javascript
复制
{
        "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?

EN

回答 2

Unix & Linux用户

发布于 2015-11-17 02:43:22

对于那些不懂高级awk的人(比如像我这样的人)和没有预装jq的人来说,一个简单的解决方案是将几个本机命令组合起来,如下所示:

代码语言:javascript
复制
grep -A2 '"id": 1490,' stats.json | sed '/1490/d;s/"//g;s/,//;s/\s*//'

--如果您只是试图获取值,那么使用grep比使用awksed:

更容易

代码语言:javascript
复制
grep -A2 '"id": 1490,' stats.json | grep -o "[0-9]*\.[0-9]*"

为了提供一个解释,这似乎是我最简单的方法。

  • grep -A2获取您在JSON中寻找的行,以及包含温度和湿度的以下2行。
  • grep -o的管道只打印由.分隔的数字数字(这永远不会发生在第一条1490线上,因此留下了两个值--温度和湿度)。非常简单。在我看来,甚至比使用jq更简单。
票数 1
EN

Unix & Linux用户

发布于 2021-07-12 07:21:35

要使用id 1490从每条消息中获取温度和湿度,可以使用以下选项卡分隔列表:

代码语言:javascript
复制
jq -r '.message | select(.id == 1490) | [ .temperature, .humidity ] | @tsv' 

给定问题中的数据的输出:

代码语言:javascript
复制
25.1    40

要获得CSV输出,添加一个标头,请使用

代码语言:javascript
复制
jq -s -r '[ "temperature", "humidity" ], (.[] | .message | select(.id == 1490) | [ .temperature, .humidity ]) | @csv' 

注意这里添加的-s在"slurp模式“中使用jq。它将输入集中的所有对象读入一个数组中,我们使用这个数组首先将@csv操作符CSV头作为数组,然后给出一组包含我们从数据中提取的各个CSV记录的数组。

给定问题中的数据的输出:

代码语言:javascript
复制
"temperature","humidity"
25.1,40
票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/243428

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档