我正在尝试在Windows计算机上运行jq
查询,并从输出的单独一行中提取值
jq -r .Accounts[].Id
输出
204359864429
224271824096
282276286062
210394168456
090161402717
如何运行jq
查询,以便将输出合并在用空格隔开的一行上
这就是我所需要的-
204359864429 224271824096 282276286062 210394168456 090161402717
任何帮助将不胜感激。
答案 0 :(得分:2)
通常的方法是使用@csv
或@tsv
运算符将结果转换为CSV或制表符分隔格式。这些运算符需要将结果包含在数组中。为了使您的情况也有一个空格分隔,我们可以执行一个简单的join(" ")
操作
jq -r '[.Accounts[].Id]|join(" ")'
答案 1 :(得分:0)
您可以使用@sh
格式程序:
jq -r ".Accounts[].Id | @sh"
通过jq文档:
对输入进行转义,以适合在POSIX Shell的命令行中使用。如果输入是数组,则输出将是一系列用空格分隔的字符串。
参考:
答案 2 :(得分:0)
起初我认为上面的 join()
解决方案不起作用。然后我意识到我“过度供给”了 join()
过滤器,导致它失败,因为我提供的不仅仅是一个简单的数组作为输入。我用 ,
连接了几个过滤器,但未能限制我的 join()
的范围。
jq -r \
'.ansible_facts |
.ansible_hostname,
.ansible_all_ipv4_addresses | join(" "),
.ansible_local."aws-public-ipv4".publicIP'
这给了错误,
jq: error (at <stdin>:0): Cannot iterate over string ("hostone")
因为 jq 不仅试图“消耗”ansible_all_ipv4_addresses
,还试图“消耗”前面的 ansible_hostname
过滤器的输出(我不确定为什么会这样,或者它是否是 jq 的作者有意为之).
jq -r \
'.ansible_facts |
.ansible_hostname,
(.ansible_all_ipv4_addresses | join(" ")),
.ansible_local."aws-public-ipv4".publicIP'
在这里,我只将 join()
限制为 .ansible_all_ipv4_addresses
(ansible_all_ipv4_addresses
是我希望转换为单个空格分隔字符串的 IP 地址数组)。
PS:我发现 @sh
过滤器会根据需要生成以空格分隔的输出,但另外用单引号分隔每个输出项。 >
P.P.S.:
这是我的解决方法,直到我发现 join()
在正确使用时与它的工作方式相同(见上文):
jq -r '.Accounts[].Id | @tsv | sub("\t";" ";"g")'
解释:@tsv
过滤器产生 Tab S 分离的 V alues,然后sub()
过滤器用空格替换制表符,g局部。