如何使用jq从json字符串中提取字段

时间:2019-06-04 12:40:20

标签: json bash jq

如何使用jq从JSON文件中提取两个字段?

当我运行'jq'.node'out.json时,我在输出中得到单词'null'

这是我在一个名为out.json的文件中的所有内容

head out.json 
{ "items": [ {"node":"aaaa-cn001.me.com","status":"success","result":{"stdout":"3.10.0-957.12.1.el7.x86_64\n","stderr":"","exit_code":0}} , {"node":"aaaa-cn002.me.com","status":"success","result":{"stdout":"3.10.0-957.10.1.el7.x86_64\n","stderr":"","exit_code":0}} , {"node":"aaaa-cn003.me.com","status":"success","result":{"stdout":"3.10.0-957.10.1.el7.x86_64\n","stderr":"","exit_code":0}} , {"node":"aaaa-cn004.me.com","status":"success","result":{"stdout":"3.10.0-957.12.1.el7.x86_64\n","stderr":"","exit_code":0}}

我希望输出是这样的:

aaaa-cn001.me.com 3.10.0-957.12.1.el7.x86_64
aaaa-cn002.me.com 3.10.0-957.10.1.el7.x86_64
aaaa-cn003.me.com 3.10.0-957.10.1.el7.x86_64
aaaa-cn004.me.com 3.10.0-957.12.1.el7.x86_64

2 个答案:

答案 0 :(得分:5)

您想要以下内容:

jq --raw-output '.items[] | .node + " " + .result.stdout' out.json

您可以try it here

答案 1 :(得分:1)

如果对替代解决方案感兴趣,则有另一种方法可以实现这一点-使用基于步行路径的Unix实用程序 jtc

bash $ <out.json jtc -w'[items][:][node]<n>v[-1][result][stdout]' -T'"{n} {}"' -qq
aaaa-cn001.me.com 3.10.0-957.12.1.el7.x86_64

aaaa-cn002.me.com 3.10.0-957.10.1.el7.x86_64

aaaa-cn003.me.com 3.10.0-957.10.1.el7.x86_64

aaaa-cn004.me.com 3.10.0-957.12.1.el7.x86_64

bash $ 

请注意,这里会出现多余的行,因为stdout值带有尾随\n,在不引用JSON字符串(-qq)时会导致多余的间隔符。

如果您不想打印保留该行,请使用此表格,然后:

bash $ <out.json jtc -w'[items][:][node]<n>v[-1][result][stdout]:<(.*)\\n>R' -T'"{n} {$1}"' -qq
aaaa-cn001.me.com 3.10.0-957.12.1.el7.x86_64
aaaa-cn002.me.com 3.10.0-957.10.1.el7.x86_64
aaaa-cn003.me.com 3.10.0-957.10.1.el7.x86_64
aaaa-cn004.me.com 3.10.0-957.12.1.el7.x86_64
bash $ 

PS>披露:我是jtc-用于JSON操作的shell cli工具的创建者