2016-04-14 31 views
0

私はこの構造のJSON持っている:jsonでjsonを検索するにはどうすればよいですか?

{ 
    "nodes": { 
    "60e327ee58a0": { 
     "nodeinfo": { 
     "network": { 
      "mesh": { 
      "bat0": { 
       "interfaces": { 
       "wireless": [ 
        "<mac-address-removed>" 
       ], 
       "tunnel": [ 
        "<mac-address-removed>" 
       ] 
       } 
      } 
      }, 
      "mac": "<mac removed>", 
      "addresses": [ 
      "<ipv6 removed>", 
      "<ipv6 removed>" 
      ] 
     }, 
     "hardware": { 
      "model": "TP-Link TL-WR841N/ND v10", 
      "nproc": 1 
     }, 
     "software": { 
      "batman-adv": { 
      "compat": 15, 
      "version": "2015.1" 
      }, 
      "autoupdater": { 
      "branch": "stable", 
      "enabled": true 
      }, 
      "firmware": { 
      "release": "v2016.1+1.0.1", 
      "base": "gluon-v2016.1" 
      }, 
      "status-page": { 
      "api": 1 
      }, 
      "fastd": { 
      "enabled": true, 
      "version": "v17" 
      } 
     }, 
     "hostname": "Antoniusweg12", 
     "system": { 
      "site_code": "ffmsd03" 
     }, 
     "node_id": "60e327ee58a0" 
     }, 
     "lastseen": "2016-04-14T12:39:04", 
     "flags": { 
     "gateway": false, 
     "online": true 
     }, 
     "firstseen": "2016-03-16T15:14:04", 
     "statistics": { 
     "clients": 1, 
     "gateway": "de:ad:be:ef:43:02", 
     "rootfs_usage": 0.6041666666666667, 
     "loadavg": 0.09, 
     "uptime": 1822037.41, 
     "memory_usage": 0.8124737210932025, 
     "traffic": { 
      "rx": { 
      "packets": 50393821, 
      "bytes": 5061895206 
      }, 
      "forward": { 
      "packets": 173, 
      "bytes": 17417 
      }, 
      "mgmt_rx": { 
      "packets": 47453745, 
      "bytes": 6623785282 
      }, 
      "tx": { 
      "packets": 1205695, 
      "bytes": 173509528, 
      "dropped": 5683 
      }, 
      "mgmt_tx": { 
      "packets": 37906725, 
      "bytes": 11475209742 
      } 
     } 
     } 
    }, 
    "30b5c2b042f4": { 
<next block...> 

をそして私は、ホスト名、MACまたはIPv6のJQでそれを照会します。オブジェクトが事前にインデックスに助けを

感謝を持っているよう

cat nodes.json |jq -c '.nodes[] | select(.nodes[]| contains("Antoniusweg12"))' 

ほとんどの例は、JSON構造のこの種に適合しません。

答えて

0

フィルタリングする場合は、確認するプロパティまでドリルダウンし、条件に一致するかどうかを確認する必要があります。あなたは単に名前をつけることは期待できません。あなたは魔法のようにあなたが望む結果を提示されます。

ホスト名による検索、それは各ノードの.nodeinfo.hostname財産で発見されています。同様に、MACアドレスの

$ jq -c --arg hostname "Antoniusweg12" \ 
'.nodes[] | select(.nodeinfo.hostname == $hostname)' nodes.json 

、それが.nodeinfo.network.macプロパティで見つかっています:IPアドレスの

$ jq -c --arg mac "aa:bb:cc:dd:ee:ff" \ 
'.nodes[] | select(.nodeinfo.network.mac == $mac)' nodes.json 

、それらの配列がありますが、クエリでそれほど違いはありません。 .nodeinfo.network.addressesプロパティにあります:

$ jq -c --arg ip "aaaa:bbbb:cccc:dddd::1" \ 
'.nodes[] | select(.nodeinfo.network.addresses[] == $ip)' nodes.json 
0

ここでもう1つ質問します。どのようなキーと値の組み合わせが発生しても、値が "Antoniusweg12"であるキー "hostname"、つまり がすべて見つかったとします。

以下は関心のキー/値の組み合わせへのパスを明らかにする:

paths as $p 
| select ($p[-1] == "hostname" and getpath($p) == "Antoniusweg12") 
| $p 

与えられた入力JSONのための結果:あなたが含まれているオブジェクトへのパスを望んでいた場合

[ 
    "nodes", 
    "60e327ee58a0", 
    "nodeinfo", 
    "hostname" 
] 

最後に$p$p[0:-1]に置き換えます。あなたが含むオブジェクト自体たい場合:getpath($p[0:-1])

0

をここで指定した$needleaddressesmacまたはhostnameフィールドのいずれかに存在するノードを検索するソリューションです。

"<ipv6 removed>" as $needle # set to whatever you like 

| foreach (.nodes|keys[]) as $k (
    . 
    ; . 
    ; (  .nodes[$k].nodeinfo.network.addresses? 
     + [ .nodes[$k].nodeinfo.network.mac? 
      , .nodes[$k].nodeinfo.hostname? 
      ] 
     ) as $haystack 

    | if $haystack | index($needle) 
     then {($k): .nodes[$k]} 
     else empty 
     end 
) 

編集:私は今の形foreach E as $X (.; .; R)のフィルタを実現するには、ほとんど常にので、上記のE as $X | Rのように書き換えることができ本当にただ

"<ipv6 removed>" as $needle 

| (.nodes|keys[]) as $k 
| (  .nodes[$k].nodeinfo.network.addresses? 
    + [ .nodes[$k].nodeinfo.network.mac? 
     , .nodes[$k].nodeinfo.hostname? 
    ] 
) as $haystack 

| if $haystack | index($needle) 
    then {($k): .nodes[$k]} 
    else empty 
    end 
です
関連する問題