打印 yaml 中的键,以便它们可用于 jsonpath

gue*_*tli 10 jsonpath jq kubernetes yq

echo "apiVersion: v1\nkind: Node\nmetadata:\n  name: host-cluster-control-plane-64j47\n  labels:\n    beta.kubernetes.io/arch: amd64\n" | yq -o p\n
Run Code Online (Sandbox Code Playgroud)\n

结果:

\n
apiVersion = v1\nkind = Node\nmetadata.name = host-cluster-control-plane-64j47\nmetadata.labels.beta.kubernetes.io/arch = amd64\n
Run Code Online (Sandbox Code Playgroud)\n

这几乎就是我想要的。我正在寻找获得价值的钥匙。

\n

我可以metadata.name这样使用:

\n
echo "apiVersion: v1\nkind: Node\nmetadata:\n  name: host-cluster-control-plane-64j47\n  labels:\n    beta.kubernetes.io/arch: amd64\n" | yq '.metadata.name'\n
Run Code Online (Sandbox Code Playgroud)\n

但如果需要,-o p选项yq不会引用该键。

\n

我不能使用metadata.labels.beta.kubernetes.io/archas 键,因为正确的语法是metadata.labels["beta.kubernetes.io/arch"].

\n

yq是否有一种自动方法来获取 yaml 文件的密钥,以便我可以在(或)中使用密钥jq

\n

所需的输出将是这样的:

\n
apiVersion = v1\nkind = Node\nmetadata.name = host-cluster-control-plane-64j47\nmetadata.labels["beta.kubernetes.io/arch"] = amd64\n
Run Code Online (Sandbox Code Playgroud)\n

我正在寻找有效的密钥,因为我想创建第二个命令行来选择这些值。

\n

例如:

\n
\xe2\x9d\xaf k get nodes -o yaml | yq '.items[].metadata.labels["beta.kubernetes.io/arch"]'\n\namd64\namd64\namd64\n
Run Code Online (Sandbox Code Playgroud)\n

mik*_*e.f 5

您可以通过执行以下操作来接近:

yq '(.. | key | select(test("\."))) |= ("[\"" + . + "\"]")' file.yaml -op

apiVersion = v1
kind = Node
metadata.name = host-cluster-control-plane-64j47
metadata.labels.["beta.kubernetes.io/arch"] = amd64

Run Code Online (Sandbox Code Playgroud)

或者你可以这样做:

yq '(.. | key | select(test("\."))) |= sub("\.", "\.")' file.yaml -op

apiVersion = v1
kind = Node
metadata.name = host-cluster-control-plane-64j47
metadata.labels.beta\\.kubernetes\\.io/arch = amd64
Run Code Online (Sandbox Code Playgroud)

顺便说一句 - 我不确定它应该如何在属性文件中转义,我愿意更新 yq 以在本机上执行此操作,有人在 github 上提出了一个包含详细信息的错误...

免责声明:我写的是yq