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]}그런 다음 0부터 시작하는 형식을 사용하여 배열 요소에 액세스할 수 있습니다 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); }' 

관련 정보