Bir json'da birden çok alanı seri olarak ayrıştırmak ve görüntülemek için jq kullanma


237

Bende bu Json var

{
    "users": [
        {
            "first": "Stevie",
            "last": "Wonder"
        },
        {
            "first": "Michael",
            "last": "Jackson"
        }
    ]
}

Jq kullanarak ad ve soyadını seri olarak görüntülemek istiyorum. Böyle -

Stevie Wonder
Michael Jackson

Bu ne kadar uzağa gitti -

jq '.users[].first, .users[].last'

Ama görüntülenir

"Stevie"
"Michael"
"Wonder"
"Jackson"

Aşağıdakilere dikkat edin -

  1. Ben istemiyorum çift tırnak.
  2. İstemediğim taşıma dönüşü.
  3. Karmakarışık. Sorgum önce önce tüm adları sonra soyadlarını görüntüler. Ancak, ilk-son, ilk-son çifti istiyorum.

Yanıtlar:



203

Dizeleri birleştirmek için ek kullanabilirsiniz .

Dizeler daha büyük bir dizeye birleştirilerek eklenir.

jq '.users[] | .first + " " + .last'

Yukarıdaki her ikisi de firstve lastdize olduğunda çalışır . Farklı veri türlerini (sayı ve dize) çıkarıyorsanız, eşdeğer türlere dönüştürmemiz gerekir. Bu sorudaki çözüme atıfta bulunarak . Örneğin.

jq '.users[] | .first + " " + (.number|tostring)'

41
JSON tırnak işaretlerini kaldırmak için, jr'yi -r seçeneğiyle çağırın, örneğin jq -r '.users [] | .first + "" + .last '
zirve

4
+1, ancak kullanım durumum için iki sayıyı aynı satıra biçimlendirmeye çalışıyorum. Bu yaklaşım başarısız olur çünkü " "bir sayıya eklenemez . Eric'in cevabı bu dava için daha iyi bir sonuç verir.
Synesso

9
@Synesso: (.numA|tostring) + " " + (.numB|tostring)Çalışmalı. Veya kullanım dize enterpolasyon yerine: "\(.numA) \(.numB)".
LS

Yaptığımda jq '.users[] | .first + " " + .last', çok iyi çalıştı, ancak .firstve arasında bir satırsonuna neden oldu .last. Değiştim " "için "@"ve daha sonra bir yaptığımız sed 's/@/ /g'çıktı olarak "John Smith" almak için çıkış üzerinde. Böyle bir şey:jq '.users[] | .first + "@" + .last' | sed 's/@/ /g'
Bloodysock


14

Yukarıdaki yanıtların her ikisi de anahtar, değer dizeleri ise iyi çalışır, ancak bir dize ve tamsayı eklemek için bir durum vardı (yukarıdaki ifadeleri kullanarak jq hataları)

Gereksinim: json'un altında bir url oluşturmak

pradeep@seleniumframework>curl http://192.168.99.103:8500/v1/catalog/service/apache-443 | jq .[0]
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   251  100   251    0     0   155k      0 --:--:-- --:--:-- --:--:--  245k
{
  "Node": "myconsul",
  "Address": "192.168.99.103",
  "ServiceID": "4ce41e90ede4:compassionate_wozniak:443",
  "ServiceName": "apache-443",
  "ServiceTags": [],
  "ServiceAddress": "",
  "ServicePort": 1443,
  "ServiceEnableTagOverride": false,
  "CreateIndex": 45,
  "ModifyIndex": 45
}

Çözüm:

curl http://192.168.99.103:8500/v1/catalog/service/apache-443 |
jq '.[0] | "http://" + .Address + ":" + "\(.ServicePort)"'

kapanış parantezinden kaçmanın gerekli olmadığını ve hatalı olacağını unutmayın.
nymo

2
@nymo: Bu kaçmıyor. \(...)dize enterpolasyondur. Burada sayısal .ServicePortdizeye dönüşür . +Bu çözeltiyi kısaltmak için işaretlerin yerine enterpolasyon kullanılabilir .
LS

12

Bu bir dizi isim üretecektir

> jq '[ .users[] | (.first + " " + .last) ]' ~/test.json

[
  "Stevie Wonder",
  "Michael Jackson"
]

4

Böyle bir şey yaparak istediğime oldukça yaklaştım

cat my.json | jq '.my.prefix[] | .primary_key + ":", (.sub.prefix[] | "    - " + .sub_key)' | tr -d '"' 

Çıktısı benim için genellikle çok fazla sorun yaşamadan diğer araçlara aktaracak kadar yakın. (Hala giriş json bir alt kümesini basicallt ihracat için bir yol arıyorum)


1
Benim durumumda bu tür işler, sadece | tr -d '"' sonunda ve
jq'ye

4

benim yaklaşımım olacak (json örneğiniz iyi biçimlendirilmemiş .. sanırım bu sadece bir örnek)

jq '.Front[] | [.Name,.Out,.In,.Groups] | join("|")'  front.json  > output.txt

böyle bir şey döndürür

"new.domain.com-80|8.8.8.8|192.168.2.2:80|192.168.3.29:80 192.168.3.30:80"
"new.domain.com -443|8.8.8.8|192.168.2.2:443|192.168.3.29:443 192.168.3.30:443"

ve çıktıyı düzenli ifadeyle grep.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.