361

我有这个 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. 我不想要的双引号。
  2. 我不要的回车。
  3. 乱七八糟的 我的查询首先显示所有名字,然后显示所有姓氏。但是,我想要倒数第一对。
4

8 回答 8

483

我建议使用字符串插值:

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

我们正在.users[]使用字符串插值生成字符串“.first .last”的结果。\(foo)语法用于字符串插值jq。所以,对于上面的例子,它变成了“Stevie Wonder”(".users[].first .users[].second"按元素工作)和“Michael Jackson”。

jq 参考:字符串插值

于 2015-07-14T22:04:31.260 回答
313

您可以使用加法来连接字符串。

通过加入更大的字符串来添加字符串

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

firstlast都是字符串时,上述方法有效。如果您要提取不同的数据类型(数字和字符串),那么我们需要转换为等效类型。参考这个问题的解决方案。例如。

jq '.users[] | .first + " " + (.number|tostring)'
于 2015-08-03T15:41:25.817 回答
66
jq '.users[]|.first,.last' | paste - -
于 2019-06-28T03:25:00.640 回答
23

除了其他人的建议之外,我认为有两个选项值得一提。

打印为 CSV/TSV

$ cat file.json | jq -r '.users[] | [.first, .last] | @tsv'
Stevie  Wonder
Michael Jackson
cat file.json | jq -r '.users[] | [.first, .last] | @csv'
"Stevie","Wonder"
"Michael","Jackson"

第一个表达式 ,.users[]从最外层数组中取消嵌套对象,如问题中给出的代码中所示。下一个表达式[.first, .last]为每个输入对象创建一个新的值数组,最后一个表达式使用内置函数@tsv@csv将所有输入数组分别打印为制表符分隔和逗号分隔的值。

打印为 JSON 值

同样,可以再次构造 JSON 值,如果您只想保留字段的子集,这很有趣:

$ cat file.json | jq -c '.users[] | {first}'
{"first":"Stevie"}
{"first":"Michael"}
于 2021-08-05T09:59:03.377 回答
18

我的方法将是(您的 json 示例格式不正确.. 猜这只是一个示例)

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

返回这样的东西

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

并使用正则表达式 grep 输出。

于 2020-03-17T17:03:26.490 回答
16

这将产生一个名称数组

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

[
  "Stevie Wonder",
  "Michael Jackson"
]
于 2019-06-06T19:56:34.003 回答
16

虽然如果 key,value 是字符串,上述两个答案都可以很好地工作,但我遇到了附加字符串和整数的情况(使用上述表达式的 jq 错误)

要求:在json下面构造一个url

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
}

解决方案:

curl http://192.168.99.103:8500/v1/catalog/service/apache-443 |
jq '.[0] | "http://" + .Address + ":" + "\(.ServicePort)"'
于 2016-05-01T20:39:18.253 回答
6

通过做这样的事情,我已经非常接近我想要的了

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

其输出与 yaml 足够接近,我通常可以毫无问题地将其导入其他工具。(我仍在寻找一种方法来基本导出输入 json 的子集)

于 2017-07-21T21:31:16.647 回答