从 Grep 获取输出并选择变量部分

从 Grep 获取输出并选择变量部分

好的,有类似的问题,但不完全是我想要的。

我正在使用 Kubernetes,所以信息来自于此,但这个问题是针对 Shell 脚本的,所以请不要把我推给 Kubernetes 人员。 :)

我运行以下命令来获取信息:

kubectl get pods -o wide --all-namespaces | grep sonarqube-

结果示例:

default       sonarqube-664b4fd48-g6nvb                   1/1       Running   0          4d        10.233.64.6     local-node-0

目标:我想要的是获取前 2 个值(defaultsonarqube-664b4fd48-g6nvb)并将它们转换为可以在脚本中其他地方使用的变量。

我想使用变量的命令示例如下:

kubectl cp <file> ${namespace}/${deployment}:/opt/app/extensions/plugins/

谢谢,如果需要更多信息,请告诉我。

答案1

巴什read功能:

read -r namespace deployment other < <(kubectl get pods -o wide --all-namespaces | grep sonarqube-)
kubectl cp <file> "${namespace}/${deployment}:/opt/app/extensions/plugins/"

答案2

一般来说

在其他 shell 中有效的bash是从管道的输出设置位置参数:

set -f -- $(kubectl get pods -o wide --all-namespaces | grep sonarqube- )

在这种情况下,您现在可以访问变量,如$1$2等。

专门针对 bash

可以bash创建一个数组变量,如下所示:

var=( $(kubectl get pods -o wide --all-namespaces | grep sonarqube- ) )

习惯用法是var=( ... ),在本例中是管道的输出grep

然后,您可以使用 形式 访问数组的元素${var[n]},从零开始n

答案3

在这种情况下(具有可预测的输出列),我通常会使用 awk。像这样的东西可能会有用:

kubectl get pods -o wide --all-namespaces | awk '/sonarqube-/ { cmd=sprintf("kubectl cp <file> %s/%s:/opt/app/extensions/plugins", $1, $2); print(cmd); system(cmd); }' 

相关内容