存储在变量中的 json 键的 grep/打印值

Giu*_*sse 3 json jq

我有一个带有嵌套 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
            }
          ]
        }
      ]
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

寻找一种方法来 grep 嵌套 json 中的“值”(如突出显示的那个)变量a

我正在使用grepjq但我无法显示价值,它显示“日期”( echo $result | grep -Po '"dates":.*?[^\\],.*?[^\\]"') 而不仅仅是价值。

有什么帮助吗?

gle*_*man 11

您想要来自(“日期”数组中的第一个对象)来自(“坐标”数组中的第一个对象)来自(“数据”数组中的第一个对象)的“值”

$ 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
Run Code Online (Sandbox Code Playgroud)


小智 8

您可能还需要考虑安装gron,它是一个“使 JSON 可以 grepable!”的实用程序。

随着a定义为你的问题,

echo $a | gron
Run Code Online (Sandbox Code Playgroud)

返回

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";
Run Code Online (Sandbox Code Playgroud)

这确实使处理变得容易:

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";
Run Code Online (Sandbox Code Playgroud)


ste*_*ver 5

使用Miller及其默认的 JSON 数组展平:

$ mlr --ijson --onidx cut -f 'data:0:coordinates:0:dates:0:value' <<<"$a"
25.1
Run Code Online (Sandbox Code Playgroud)

或正则表达式匹配扁平元素名称

$ mlr --ijson --onidx cut -r -f 'value$' <<<"$a"
25.1
Run Code Online (Sandbox Code Playgroud)