我最近了解了一个出色的小工具jq,它允许您将未格式化的JSON输出通过管道传递到其中,然后将其重新格式化并以非常好的格式化后的颜色编码json布局输出到屏幕。例如:

echo '{"value": "New", "onclick": "CreateNewDoc()"}' | jq


但是,我发现无法将格式化结果(来自jq)通过管道传输到标准工具集中的其他工具(例如grep,sed)中,awk等。如何使该输出可传递管道?例如,这不起作用:

'{"value": "New", "onclick": "CreateNewDoc()"}' | jq | grep value


评论

这似乎是通用命令行工具上的用法问题。似乎更适合超级用户或Linux和Unix?

@XiongChiamiov-我在这里发布是因为DevOps似乎更可能与JSON / REST交互,并且会受益于1)知道这种工具以及2)正确使用。我会将其归类为DevOps命令行工具,而不是一般用途。

我的开发人员比我更熟悉这些工具,因为他们正在构建API,并因此在一整天不断对其进行测试。虽然这当然会因公司而异,但我仍然认为curl / httpie / jq / etc。仅仅是通用的程序员工具,而不是与DevOps相关的工具。

#1 楼

Ok试图确切地理解您的问题...这是发生的情况:

$ echo '{"value": "New", "onclick": "CreateNewDoc()"}' | jq | grep value
jq - commandline JSON processor [version 1.5-1-a5b5cbe]
Usage: jq [options] <jq filter> [file...]
[rest of output is omitted for brevity]


这里要注意的重要事项是用法行(强调是我的):


用法:jq [选项] [文件...]


如果不是这样,则过滤器不是可选的给出一个,jq尝试将命令行的其余部分解析为其过滤器,并引发错误。一种适合您的情况的解决方法是:

$ echo '{"value": "New", "onclick": "CreateNewDoc()"}' | jq '.' | grep value
  "value": "New",


当通过的过滤器为“”时,它的确抓住了“值”行。 -这只是打印出json内容,但这与jq的最佳用法相去甚远。如果只希望获得此行,则最好执行以下操作:

$ echo '{"value": "New", "onclick": "CreateNewDoc()"}' | jq '.value'
"New"


如果希望获得不带引号的输出,则可以向jq添加add -r选项,例如因此:

$ echo '{"value": "New", "onclick": "CreateNewDoc()"}' | jq -r '.value'
New
来自jq --help




-r输出原始字符串,而不是JSON文本;


只是jq的一点介绍,可能根本不足以解决您的问题,但是由于您未指定问题,我无能为力。

评论


我认为您可能一直在想我的问题。这正是解决方案。空过滤器可以解决此问题。

–詹姆斯·谢威(James Shewey)
17/12/20在16:40