Grepから出力を取得し、変数部分を選択します。

Grepから出力を取得し、変数部分を選択します。

さて、似たような質問がありますが、まさに私が望むものではありません。

私はKubernetesを使用しているので、情報はそこから出てきますが、この質問はシェルスクリプトに関するものなので、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つの値(defaultsum sonarqube-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

一般的に言えば

他のシェルで動作するのは、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); }' 

関連情報