首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Yq:检索对象键名称

Yq:检索对象键名称
EN

Stack Overflow用户
提问于 2019-03-21 12:06:22
回答 2查看 21.7K关注 0票数 5

我有一个YAML文件(在我的例子中是docker-复合文件),如下所示:

代码语言:javascript
复制
networks:
    foo:
      some_opts: "covfefe"
    bar:
      some_opts: "such wow"
services:
  apache:
    image: 'apache:1.0.0'
    restart: always
  mysql:
    image: 'mysql:1.0.0'
    restart: always
  php:
    image: 'php'
    restart: always

我想提取服务名称,这要感谢yq (相当于jq ),但对于YAML来说,它有这样的输出:

代码语言:javascript
复制
"apache"
"mysql"
"php"

现在我可以这样做:

代码语言:javascript
复制
$ cat docker-compose.yml | yq '.services' | yq 'keys[]'
"apache"
"mysql"
"php"

即使成功了,双管yq在我看来也很奇怪。我想我做错了。

问题:是否有任何方法通过一个yq命令来实现它?

我从这个问题那里吸取了灵感,但没有成功。

代码语言:javascript
复制
$ cat docker-compose.yml | yq '.services.keys[]'
jq: error: Cannot iterate over null
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-21 12:48:41

keysjq中的内置函数,当给定对象时,返回数组中的键。因此,它实际上不是yaml的一部分(不是属性),这意味着您不能执行services.keys

要获得密钥,可以在使用Python yq时执行以下操作

我们将在第一部分中获取services的对象,然后将其传递给keys,后者将根据给定的对象返回一个键列表。

代码语言:javascript
复制
cat docker-compose.yml | yq '.services | keys'

或者像这样(没有猫和烟斗):

代码语言:javascript
复制
yq '.services | keys' docker-compose.yml

产出如下:

代码语言:javascript
复制
[
  "apache",
  "mysql",
  "php"
]

为了去掉括号:

代码语言:javascript
复制
yq '.services | keys[]' docker-compose.yml

产出:

代码语言:javascript
复制
"apache"
"mysql"
"php"

有关更多详细信息,您可以在jq中查看jq。请注意,yqjq的包装器,因此jq文档将有助于yq的帮助。

围棋yq上你可以做到

代码语言:javascript
复制
yq e '.services | keys'
票数 15
EN

Stack Overflow用户

发布于 2019-07-23 09:48:03

因为您只想列出来自文件的服务,所以可以使用命令来实现这一点。

代码语言:javascript
复制
docker-compose config --services

不直接回答这个问题,因为它没有使用yq,但可能会有所帮助;)

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55280071

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档