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

4

如何使用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
你的输入不是 JSON 格式的。(在结尾处缺少 ']}' 符号)。如果人们不必对你的示例数据进行修改,回答问题的可能性会更大。 - William Pursell
2个回答

9

看起来你想要以下内容:

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

你可以在这里尝试

1
Op可能也想要-r - William Pursell
1
@WilliamPursell --raw-output-r 的长格式 :) - Aaron
@Aaron 非常感谢!我无法形容看到你的命令产生的结果时有多开心。你做得太棒了!! - rony thomas

2
如果您对替代方案感兴趣,还有另一种实现相同效果的方法 - 使用基于步行路径的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> 披露:我是用于JSON操作的jtc - shell cli工具的创作者。

最初的回答


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接