grep 및 awk를 사용한 다중 패턴 검색은 여러 줄 일치에서 작동하지 않습니다.

grep 및 awk를 사용한 다중 패턴 검색은 여러 줄 일치에서 작동하지 않습니다.

주어진 출력에서 ​​두 개의 문자열을 찾아야 합니다. 검색은 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 이므로 &&연결된 명령이 실행됩니다.

관련 정보