在bash中的特定JSON字段中找到最高价值

时间:2019-05-21 16:23:35

标签: json linux bash

我正在编写一个bash脚本,该脚本卷曲POST API。帖子中的回复具有以以下格式返回的值:

{
  "other": "irrelevant-fields",
  "results": [
    {
      "datapoints": [
        {"timestamp": 1555977600, "value": 0},
        {"timestamp": 1555984800, "value": 15},
        {"timestamp": 1555992000, "value": 5}
      ]
    }
  ]
}

我想从“值”列中提取最高的数字,但是用bash编写此代码时遇到问题。我是JSON的初学者,没有真正的引用可以用来过滤掉不需要的字符串和值,因为每个数组都除了时间戳记之外都是相同的,但是我不在乎时间戳记,只是返回的最高价值。

我当前的代码只是从bash文件中提取最大数量的通用方法:

grep -Eo '[[:digit:]]+' | sort -n | tail -n 1

...但是返回15而不是1555992000

3 个答案:

答案 0 :(得分:3)

echo '
{
  "other": "irrelevant-fields",
  "results": [
    {
      "datapoints": [
        {"timestamp": 1555977600, "value": 0},
        {"timestamp": 1555984800, "value": 15},
        {"timestamp": 1555992000, "value": 5}
      ]
    }
  ]
}
' | jq '.results[].datapoints | max_by(.value)'

输出将如下所示:

{
  "timestamp": 1555984800,
  "value": 15
}

有关更多信息,请参见jq上的这篇中篇文章,或https://stedolan.github.io/jq/上程序的主页

答案 1 :(得分:0)

让我为您提供基于JSON步行路径Unix工具的解决方案: jtc

1。如果您只想知道datapoints中的最大值,则可以转储所有记录,对所有记录进行排序并显示最后一个:

bash $ <file.json jtc -w'<datapoints>l[:][value]' -r | sort -n | tail -1
46.0
bash $ 

2。如果您想查看记录(带有时间戳),则将是这样:

bash $ <file.json jtc -w'<datapoints>l[:]' -r | sort -n -k5 | tail -1
{ "timestamp": 1556611200, "value": 46.0 }
bash $

PS>披露:我是jtc工具的创建者

答案 2 :(得分:0)

请使用适当的JSON解释器/解析器(例如Xidel)处理JSON。

$ cat <<EOF | xidel -s - -e '$json/max((.//datapoints)()/value)'
{
  "other": "irrelevant-fields",
  "results": [
    {
      "datapoints": [
        {"timestamp": 1555977600, "value": 0},
        {"timestamp": 1555984800, "value": 15},
        {"timestamp": 1555992000, "value": 5}
      ]
    }
  ]
}
EOF

这将返回15

(或完整的-e '$json/max((results)()/(datapoints)()/value)'