这里是Json

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

使用jq,我想连续显示姓和名。就像这样

Stevie Wonder
Michael Jackson

这就是我得到的结果

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

但是它显示

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

注意以下几点:

我不想要的双引号。 我不想要的马车回来了。 这是混乱的。我的查询首先显示所有的姓,然后显示所有的姓。但是,我想要倒数第一,倒数第一的一双。


当前回答

这将产生一个名称数组

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

[
  "Stevie Wonder",
  "Michael Jackson"
]

其他回答

我建议使用字符串插值:

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

我们正在处理.users[]的结果以生成字符串”。First .last"使用字符串插值。\(foo)语法用于jq中的字符串插值。因此,对于上面的例子,它变成了“Stevie Wonder”(“.users[]”)。第一个条款[]。第二个“工作元素”)和“迈克尔·杰克逊”。

jq引用:字符串插值

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

字符串是通过连接到更大的字符串来添加的。

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

当第一个和最后一个都是字符串时,上述方法有效。如果要提取不同的数据类型(数字和字符串),则需要转换为等效的类型。关于这个问题的解决方法。为例。

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

这将产生一个名称数组

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

[
  "Stevie Wonder",
  "Michael Jackson"
]

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

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

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

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