2016-04-14 14 views
0

Bu yapının bir json vardır:Json ile jq değerleri nasıl aranır?

{ 
    "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...> 

Ve hostname, mac veya IPv6 için JQ ile sorgulamak istiyorum. nesneleri önceden bir indeksi yardım

Teşekkür sahip olarak

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

Çoğu örnekler json yapısı bu tür uymaz.

cevap

0

Filtreleyecekseniz, kontrol etmek istediğiniz mülkü ayrıntılı olarak incelemeniz ve kriterlerinize uyup uymadığını öğrenmeniz gerekir. Sadece bir isim vermeyi bekleyemezsiniz ve istediğiniz sonuçlarla büyülü bir şekilde sunulacaksınız.

hostname göre arama, her düğümün .nodeinfo.hostname mülkiyet bulunur: Aynı mac adresi için

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

, bu .nodeinfo.network.mac mülkiyet bulduğunu: ip adresleri için

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

Bir dizi var ama sorguda o kadar farklı değil. Onlar .nodeinfo.network.addresses mülkiyet bulunursanız:

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

Burada başka soru üzerine almak var. Anahtar/değer bileşimi nerede olursa olsun, değerin "Antoniusweg12", olduğu "ana bilgisayar adı" anahtarının tüm oluşumlarını bulmak istediğinizi varsayalım.

şu ilgi anahtar/değer kombinasyonu yolunu ortaya çıkaracaktır:

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

verilen giriş JSON için sonuç: Eğer içeren nesneye yolunu isteseydim

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

daha sonra son $p'u $p[0:-1] ile değiştirin; Eğer içeren nesnenin kendisini istiyorsanız ve: İşte

0

getpath($p[0:-1]) belirtilen $needleaddresses, mac veya hostname alanların herhangi birinde mevcut olduğu düğümler için arama yapan bir çözümdür.

"<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 
) 

EDIT: Şimdi foreach E as $X (.; .; R) hemen her zaman E as $X | R olarak yeniden olabilir biçimde bir filtre gerçekleştirmek nedenle yukarıdaki gerçekten sadece

"<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 
olduğunu