Использование jq для синтаксического анализа и отображения нескольких полей в json

У меня есть Json

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

Используя jq, я хотел бы отображать имя и фамилию серийно. Так же -

Stevie Wonder
Michael Jackson

Вот как далеко я получил -

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

Но он отображает

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

Обратите внимание на следующее:

  • Двойные кавычки, которые мне не нужны.
  • Возврат каретки, который мне не нужен.
  • Он перепутался. В моем запросе отображаются сначала все имена, а затем все фамилии. Тем не менее, я хочу первую, последнюю пару.

Ответ 1

Я рекомендую использовать String Interpolation:

jq '.users[] | "\(.first) \(.last)"'

ссылка

Ответ 2

Вы можете использовать addition для конкатенации строк.

Строки добавляются путем объединения в большую строку.

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

Ответ 3

Хотя оба вышеупомянутых ответа хорошо работают, если ключ, значение - это строки, у меня была ситуация, чтобы добавить строку и целое число (ошибки jq, используя приведенные выше выражения)

Требование: Чтобы создать URL-адрес ниже json

[email protected]>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
}

Решение:

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

Ответ 4

Я очень близко подошел к тому, что хотел, сделав что-то вроде этого

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

Результат которого достаточно близко к yaml для меня, чтобы обычно импортировать его в другие инструменты без особых проблем. (Я все еще ищу способ basicallt экспортировать подмножество ввода json)

Ответ 5

Это произведет массив имен

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

[
  "Stevie Wonder",
  "Michael Jackson"
]

Ответ 6

jq '.users[]|.first,.last' | paste - -