Find the value of key from JSON

后端 未结 3 756
猫巷女王i
猫巷女王i 2020-12-29 08:42

I\'d like to extract the \"id\" key from this single line of JSON.

I believe this can be accomplished with grep, but I am not sure on the correct way.

相关标签:
3条回答
  • 2020-12-29 08:58

    Just pipe your data to jq and select by keys

    "data": {
        "name": "test",
        "id": "4dCYd4W9i6gHQHvd",
        "domains": [
          "www.test.domain.com",
          "test.domain.com"
        ],
        "serverid": "bbBdbbHF8PajW221",
        "ssl": null,
        "runtime": "php5.6",
        "sysuserid": "4gm4K3lUerbSPfxz",
        "datecreated": 1474597357
      },
      "actionid": "WXVAAHQDCSILMYTV"
    } | jq '.data.id'     
    
    # 4dCYd4W9i6gHQHvd
    

    Tutorial Here

    0 讨论(0)
  • 2020-12-29 09:16

    If you have a grep that can do Perl compatible regular expressions (PCRE):

    $ grep -Po '"id": *\K"[^"]*"' infile.json
    "4dCYd4W9i6gHQHvd"
    
    • -P enables PCRE
    • -o retains nothing but the match
    • "id": * matches "id" and an arbitrary amount of spaces
    • \K throws away everything to its left ("variable size positive look-behind")
    • "[^"]*" matches two quotes and all the non-quotes between them

    If your grep can't do that, you an use

    $ grep -o '"id": *"[^"]*"' infile.json | grep -o '"[^"]*"$'
    "4dCYd4W9i6gHQHvd"
    

    This uses grep twice. The result of the first command is "id": "4dCYd4W9i6gHQHvd"; the second command removes everything but a pair of quotes and the non-quotes between them, anchored at the end of the string ($).

    But, as pointed out, you shouldn't use grep for this, but a tool that can parse JSON – for example jq:

    $ jq '.data.id' infile.json
    "4dCYd4W9i6gHQHvd"
    

    This is just a simple filter for the id key in the data object. To get rid of the double quotes, you can use the -r ("raw output") option:

    $ jq -r '.data.id' infile.json
    4dCYd4W9i6gHQHvd
    

    jq can also neatly pretty print your JSON:

    $ jq . infile.json
    {
      "data": {
        "name": "test",
        "id": "4dCYd4W9i6gHQHvd",
        "domains": [
          "www.test.domain.com",
          "test.domain.com"
        ],
        "serverid": "bbBdbbHF8PajW221",
        "ssl": null,
        "runtime": "php5.6",
        "sysuserid": "4gm4K3lUerbSPfxz",
        "datecreated": 1474597357
      },
      "actionid": "WXVAAHQDCSILMYTV"
    }
    
    0 讨论(0)
  • 2020-12-29 09:21

    I found myself that the best way is to use python, as it handles JSON natively and is preinstalled on most systems these days, unlike jq:

    $ python -c 'import sys, json; print(json.load(sys.stdin)["data"]["id"])' < infile.json
    4dCYd4W9i6gHQHvd
    
    0 讨论(0)
提交回复
热议问题