为什么相同的 jsonpath 查询返回不同的输出?

Why is the same jsonpath query returning a different output?

我正在尝试使用以下 jq 查询提取 podname。

❯ kubectl get pods -l app=mssql-primary --output jsonpath='{.items[0].metadata.name}'
mssqlag-primary-deployment-77b8974bb9-dbltl%                                                                                                                                                                                                                              
❯ kubectl get pods -l app=mssql-primary -o json | jq -r '.items[0].metadata.name'
mssqlag-primary-deployment-77b8974bb9-dbltl

虽然它们都提供相同的输出,但第一个在 pod 名称末尾有一个 % 字符。有什么理由吗?第一个命令中的 jsonpath 表示有问题吗?

我猜 zsh 是你的 shell。 % 是您的 shell 输出的指示符,表示 kubectl 输出的最后一行末尾没有换行符。所以它不是 extra 输出,它实际上是原始 kubectl 命令输出 lessjq.

如果需要,您可以明确地向 jsonpath 输出添加换行符:

kubectl get pods -l app=mssql-primary --output jsonpath='{.items[0].metadata.name}{"\n"}'

或者在另一个方向上,您可以通过指定 -j 而不是 -r:

来告诉 jq 根本不要添加换行符
kubectl get pods -l app=mssql-primary -o json | jq -j '.items[0].metadata.name'

我用相同的部署名称和标签复制了您的案例。我从你的两个命令中得到相同的输出:

mssqlag-primary-deployment-77b8974bb9-dbltl

但是 kubectl ... --output jsonpath 不在终端中打印新行,而 kubectl -o json | jq -r 打印新行。

因此,如果您将命令的输出分配给一个变量,将会有相同的字符串。

OUTPUT1=$(kubectl get pods -l app=mssql-primary --output jsonpath='{.items[0].metadata.name}')
OUTPUT2=$(kubectl get pods -l app=mssql-primary -o json | jq -r '.items[0].metadata.name')

$OUTPUT1 等于 $OUTPUT2。

你得到 % 只是因为你 shell/terminal 的具体情况。