使用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. 我不想要的双引号。
  2. 我不想要的马车回来了。
  3. 这是混乱的。我的查询首先显示所有的姓,然后显示所有的姓。但是,我想要倒数第一,倒数第一的一双。
350512 次浏览

我建议使用字符串插值:

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

我们正在处理.users[]的结果,以生成字符串"。首先.last"使用字符串插值。\(foo)语法用于jq中的字符串插值。因此,对于上面的例子,它就变成了"Stevie Wonder"(".users[].first .users[].second" working elementwise)和“迈克尔·杰克逊”;

jq引用:字符串插值

你可以使用除了来连接字符串。

字符串被加入到一个更大的字符串中。

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

firstlast都是字符串时,上述方法有效。如果要提取不同的数据类型(数字和字符串),则需要转换为等效的类型。引用这个问题的解答。为例。

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

虽然以上两个答案都工作得很好,如果键,值是字符串,我有一个附加字符串和整数的情况(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)"'

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

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

它的输出与yaml非常接近,我通常可以将它导入到其他工具中,没有太多问题。(我仍然在寻找一种方法来导出输入json的一个子集)

这将产生一个名称数组

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


[
"Stevie Wonder",
"Michael Jackson"
]
jq '.users[]|.first,.last' | paste - -

我的方法将是(你的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。

除了别人提出的建议之外,我认为有两个选择值得一提。

打印为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"}