我正在编写一个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
。
答案 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)'
)