![grep/打印 json 中存储在变量中的键的值](https://linux22.com/image/176572/grep%2F%E6%89%93%E5%8D%B0%20json%20%E4%B8%AD%E5%AD%98%E5%82%A8%E5%9C%A8%E5%8F%98%E9%87%8F%E4%B8%AD%E7%9A%84%E9%94%AE%E7%9A%84%E5%80%BC.png)
我有一个带有嵌套 json 的变量,
a={
"version": "3.0",
"user": "unknown_unknown",
"dateGenerated": "2020-07-08T11:53:23Z",
"status": "OK",
"data": [
{
"parameter": "t_2m:C",
"coordinates": [
{
"lat": 39.23054,
"lon": 9.11917,
"dates": [
{
"date": "2020-07-08T15:53:23Z",
"value": 25.1
}
]
}
]
}
]
}
寻找一种方法来 grep 变量 中嵌套 json 中的“值”(如突出显示的值)a
。
我正在使用grep
andjq
但无法显示值,它显示“日期”( echo $result | grep -Po '"dates":.*?[^\\],.*?[^\\]"'
) 但不仅仅是值。
有什么帮助吗?
答案1
您需要来自(“日期”数组中的第一个对象)来自(“坐标”数组中的第一个对象)来自(“数据”数组中的第一个对象)的“值”
$ a='{"version":"3.0","user":"unknown_unknown","dateGenerated":"2020-07-08T11:53:23Z","status":"OK","data":[{"parameter":"t_2m:C","coordinates":[{"lat":39.23054,"lon":9.11917,"dates":[{"date":"2020-07-08T15:53:23Z","value":25.1}]}]}]}'
$ echo "$a" | jq -r '.data[0].coordinates[0].dates[0].value'
25.1
答案2
您可能还想考虑安装gron
,这是一个“使 JSON grepable!”的实用程序。
正如a
你的问题中所定义的,
echo $a | gron
回报
json.data = [];
json.data[0] = {};
json.data[0].coordinates = [];
json.data[0].coordinates[0] = {};
json.data[0].coordinates[0].dates = [];
json.data[0].coordinates[0].dates[0] = {};
json.data[0].coordinates[0].dates[0].date = "2020-07-08T15:53:23Z";
json.data[0].coordinates[0].dates[0].value = 25.1;
json.data[0].coordinates[0].lat = 39.23054;
json.data[0].coordinates[0].lon = 9.11917;
json.data[0].parameter = "t_2m:C";
json.dateGenerated = "2020-07-08T11:53:23Z";
json.status = "OK";
json.user = "unknown_unknown";
json.version = "3.0";
这确实使它易于处理:
$ echo $a | gron | sed -n '/value/{s/.* //; s/;//; p;}'
25.1
$ echo $a | gron | awk '/value/ {sub(/;/,""); print $NF;}'
25.1
答案3
使用磨坊主,其默认 JSON 数组扁平化:
$ mlr --ijson --onidx cut -f 'data:0:coordinates:0:dates:0:value' <<<"$a"
25.1
或正则表达式匹配扁平化元素名称
$ mlr --ijson --onidx cut -r -f 'value$' <<<"$a"
25.1