명령 출력에서 ​​부분 문자열 추출

명령 출력에서 ​​부분 문자열 추출

아래 명령 출력에서 kim​​, tin및 하위 문자열 만 추출하려면 어떻게 해야 합니까? tintu단순 분할로는 하위 문자열을 얻을 수 없습니다 -. 비트 xxx는 특정 연산자에 대한 문자열이므로 해시 처리합니다.

> kubectl get pods
xxxxxxxxxxxxxxx-x-ram-kdm-xxxxx-ramkim-6b4c49f589-6hqcj       
xxxxxxxxxxxxxxx-x-ram-kdm-xxxxx-ramtin-8d49b4dc7-bmvck        
xxxxxxxxxxxxxxx-x-ram-kdm-xxxxx-ramtintu-69b8c5b689-64fxw 

죄송합니다. 클라이언트 제한으로 인해 많은 정보를 추가할 수 없습니다. 출력의 성격을 설명하겠습니다. ram은 추출해야 하는 문자열과 연결된 고정 이름입니다. 각 출력 행의 -의 개수는 고정되어 있지 않으며 문자 수도 없습니다. 이 예에서 ram은 -ram-으로 표시됩니다. ram+'extract-string'이 나타날 때마다 연결된 문자열을 추출하면 되지만 한 번만 나타납니다.

답변1

귀하의 의견을 바탕으로 업데이트하면 이것이 귀하의 요구 사항을 충족할 것이라고 생각합니다.

$ awk -F- '{
    for (i=1;i<=NF;i++) {
      if ($i ~ "^ram.+") { sub("^ram","",$i); print $i} }
    }' kubectl.txt
kim
tin
tintu

영어: 각 입력 줄의 각 필드에 대해 필드 값이 정규식 ^ram.+("ram"으로 시작하고 뒤에 오는) 과 일치하는 경우마지막 하나더 많은 문자) 그런 다음 sub()를 사용하여 필드 시작 부분에서 "ram"을 제거하고 필드를 인쇄합니다.

또는 Perl에서는:

$ perl -F- -lne 'foreach (@F) { print $1 if (m/^ram(.+)/) }' kubectl.txt 
kim
tin
tintu

영어: 각 줄의 각 필드에 대해 필드가 정규 표현식 "^ram(.+)"과 일치하는 경우 (.+)하위 표현식과 일치하는 필드의 캡처 부분(예: "^ram" 뒤의 모든 항목)을 인쇄합니다.

참고: 행의 여러 필드가 이 패턴과 일치하면 모두 인쇄됩니다. 첫 번째 필드만 원하는 경우 next현재 행 처리를 중지하고 다음 행으로 이동합니다.

awk -F- '{
    for (i=1;i<=NF;i++) {
      if ($i ~ "^ram.+") { sub("^ram","",$i); print $i; next } }
    }' kubectl.txt

또는

perl -F- -lne 'foreach (@F) { if (m/^ram(.+)/) { print $1; next } }' kubectl.txt

비슷한 질문을 가진 다른 독자들에게 여전히 유용할 수 있으므로 이전 답변을 아래에 남겨 두겠습니다.

정확히 어떤 출력을 원하는지 잘 모르겠으므로 여기에 몇 가지 가능성이 있습니다. 둘 다 필드 6( $6)이 필드 3( )의 내용으로 시작하는 행에 대해서만 출력을 생성합니다 "^" $3. 다른 모든 줄은 무시됩니다.

kubectl.txt샘플 출력이 포함된 텍스트 파일입니다 kubectl get pods.

필드 6의 하위 문자열(문자 4부터 필드 끝까지):

$ awk -F- '$6 ~ "^" $3 { print substr($6,4) }' kubectl.txt 
kim
tin
tintu

필드 6 제거를 사용하여 처음부터 필드 3의 내용을 삭제합니다 sub(). 위의 예와는 달리 처음 3자를 제거하도록 하드코딩되지 않았으므로 $3 길이에 관계없이 작동합니다.

$ awk -F- '$6 ~ "^" $3 { sub("^" $3,"",$6); print $6}' kubectl.txt 
kim
tin
tintu

위의 필드 7 및 8과 동일하며 공백으로 구분됩니다.

$ awk -F- '$6 ~ "^" $3 { sub("^" $3,"",$6); print $6, $7, $8}' kubectl.txt
kim 6b4c49f589 6hqcj
tin 8d49b4dc7 bmvck
tintu 69b8c5b689 64fxw

위와 동일하지만 -구분 기호가 있습니다.

$ awk -F- -vOFS=- '$6 ~ "^" $3 { sub("^" $3,"",$6); print $6, $7, $8}' kubectl.txt 
kim-6b4c49f589-6hqcj
tin-8d49b4dc7-bmvck
tintu-69b8c5b689-64fxw

답변2

줄의 마지막 "ram" 뒤에 단어가 항상 표시되기를 원하는 경우 모든 줄 길이에 대해 이 작업이 수행됩니다.

sed 's/.*ram\(\w\+\).*/\1/' your_file

작동 방식은 다음과 같습니다.

  • 마지막으로 "ram"이 나타날 때까지 모든 것을 검색했습니다..*ram
  • \(위의 내용을 사용했던 것을 기억합니다.\)
  • 이 경우에는 하나 이상의 단어 문자가 됩니다.\w\+
  • 나머지 줄과 일치.*
  • 그런 다음 기억나는 것으로 바꾸세요.\1

원하는 대로 작동하는지 확인한 후 -i파일을 직접 변경하려면 다음을 추가하세요.

sed -i 's/.*ram\(\w\+\).*/\1/' your_file

명확하게 말하면 위의 내용은 다음과 같습니다.

xxxxxxxxxxxxxxx-x-ram-kdm-xxxxx-ramkim-6b4c49f589-6hqcj       
xxxxxxxxxxxxxxx-x-ram-kdm-xxxxx-ramtin-8d49b4dc7-bmvck        
xxxxxxxxxxxxxxx-x-ram-kdm-xxxxx-ramtintu-69b8c5b689-64fxw

다음을 입력하세요:

kim
tin
tintu

답변3

얻고 싶은 것이 게시물의 예에 있는 kim, 및 문자열뿐인 경우 tin다음 명령을 사용하여 수행할 수 있습니다.tintu

cut -c 36- | sed "s/-.*//"

다음은 몇 가지 예입니다.

echo "xxxxxxxxxxxxxxx-x-ram-kdm-xxxxx-ramtintu-69b8c5b689-64fxw" |  cut -c 36- | sed "s/-.*//"

산출:tintu

게시물의 입력 내용이 포함된 파일의 경우:

cat file |  cut -c 36- | sed "s/-.*//"

산출:

kim
tin
tintu

이는 명백할 수 있지만 36문자열에 항상 원하는 문자열 앞에 문자가 있는 경우에만 작동합니다.

답변4

아래 명령이 출력을 제공하는 열

awk -F "-" '{for(i=1;i<=NF;i++){if($i ~ /kim|tin|tintu/){print substr($i,4)}}}' filename

산출

kim
tin
tintu

관련 정보