주어진 출력에서 두 개의 문자열을 찾아야 합니다. 검색은 OR가 아닌 AND여야 합니다. 각 반복에 대해 지정된 출력에 "mlm" 및 "dgx" 문자열이 포함된 행을 나열하고 싶습니다.
내 출력이 출력보다 10배 낮지만 그 중 소수만이 두 문자열을 모두 가지고 있다고 가정하면 해당 반복의 출력에 두 문자열이 모두 있는 소수만 인쇄하고 싶습니다.
그래서 이 글을 읽었는데 운이 없군요.. 다중 및 패턴을 사용하여 grep을 실행하는 방법
내 시도:
kubectl get nodes -l nodeGroup=gpu -o wide --no-headers | sed -n -e 1,1p | xargs -l1 -- sh -c 'kubectl get pods --all-namespaces -o wide --field-selector=spec.nodeName=$1,status.phase=Running' -- | awk '{print $1,$2}'
출력 1
kube-system nginx-proxy-mlmpx100k8s0223p
kube-system nginx-proxy-zlmpx100k8s0223p
team1-92a20add-8857-4e94-a8b6-628db4a65e5e nominal-rigs-e2e-a1xpa-gpu-pool-62b857e3-153-5b58d86c6d-tt67w
team2-92a20add-8857-4e94-a8b6-628db4a65e5e nominal-rigs-e2e-a1xpa-gpu-pool-62b857e3-153-5b58d86c6d-tt67w
kubectl get nodes -l nodeGroup=gpu -o wide --no-headers | sed -n -e 1,1p | xargs -l1 -- sh -c 'kubectl get pods --all-namespaces -o wide --field-selector=spec.nodeName=$1,status.phase=Running' -- | awk '{print $1,$2}' | awk '/mlm/ && /team1/'
출력 2
nothing prints
예상 출력:
kube-system nginx-proxy-mlmpx100k8s0223p
team1-92a20add-8857-4e94-a8b6-628db4a65e5e nominal-rigs-e2e-a1xpa-gpu-pool-62b857e3-153-5b58d86c6d-tt67w
答え1
다음 메서드에서는 각 호출이 kubectl
두 문자열이 모두 발생하는 경우 인쇄하려는 출력 블록을 제공하거나 문자열이 하나만 발생하거나 발생하지 않는 경우 완전히 폐기한다고 가정합니다. 이것을 쉘 스크립트에 캡슐화하는 것이 더 좋습니다.
가정적으로 bash
다음을 시도해 볼 수 있습니다.
#!/bin/bash
OUTPUT=$(kubectl get nodes -l nodeGroup=gpu -o wide --no-headers)
SEARCHRES=0
grep "mlm" <<< "$OUTPUT" > /dev/null
SEARCHRES=$((SEARCHRES+$?))
grep "team1" <<< "$OUTPUT" > /dev/null
SEARCHRES=$((SEARCHRES+$?))
if (( SEARCHRES == 0 )); then echo "$OUTPUT"; fi
다른 유형의 셸이 있는 경우 몇 가지 구문 조정을 수행해야 합니다.
#!/bin/<whatever sh>
OUTPUT=$(kubectl get nodes -l nodeGroup=gpu -o wide --no-headers)
SEARCHRES=0
echo "$OUTPUT" | grep "mlm" > /dev/null
let SEARCHRES=$SEARCHRES+$?
echo "$OUTPUT" | grep "team1" > /dev/null
let SEARCHRES=$SEARCHRES+$?
if [ "$SEARCHRES" == "0" ]; then echo "$OUTPUT"; fi
kubectl
두 방법 모두 호출의 전체 출력을 쉘 변수에 버퍼링합니다. 그런 다음 두 패턴이 출력의 어느 위치에나 나타나는지 확인합니다. 행이 선택된 경우 grep
반환 코드( )가 0이므로 두 호출의 합계가 0인지 확인하면 두 패턴이 모두 존재하는지 확인할 수 있습니다. 그래야만 전체 출력을 인쇄할 수 있습니다.$?
grep
가능하니 참고해주세요이것을 단순화하세요입력하다
#!/bin/bash
OUTPUT=$(kubectl get nodes -l nodeGroup=gpu -o wide --no-headers)
grep -q "mlm" <<< "$OUTPUT" && grep -q "team1" <<< "$OUTPUT" && echo "$OUTPUT"
이전 명령의 결과 코드가 0 이므로 &&
연결된 명령이 실행됩니다.