awk의 변수 문제

awk의 변수 문제

다음 명령의 텍스트 sd를 변수로 바꾸고 싶습니다.

lsblk -r --output NAME,MOUNTPOINT | awk -F  \/ '/sd/ { dsk=substr($1,1,3);dsks[dsk]+=1 } END { for ( i in dsks ) { if (dsks[i]==1) print i } }'

나는 시도했다:

lsblk -r --output NAME,MOUNTPOINT | awk -F -v dev=sd \/ '/{print $dev}/ { dsk=substr($1,1,3);dsks[dsk]+=1 } END { for ( i in dsks ) { if (dsks[i]==1) print i } }'

그러나 이것은 작동하지 않습니다. 누가 날 도울 수 있죠? 감사해요!

awk로 파이프된 lsblk의 출력은 다음과 같습니다.

NAME MOUNTPOINT
sda 
sda1 /boot/efi
sda2 /var/lib/kubelet/pods/fae467d4-05e9-4aea-8341-0d1524a3ec9c/volume-subpaths/tigera-ca-bundle/calico-kube-controllers/1
sda3 
sdb 
sdc 
sr0 

예상되는 출력은 다음과 같습니다.

sdb
sdc

따라서 sd로 시작하는 모든 디스크는 os disk, sda를 제외하고

답변1

-F옵션은 필드 구분자를 설정합니다. 중간에 다른 옵션을 배치할 수 없습니다 awk -F -v dev=sd \/. 이는 기본적으로 필드 구분 기호를 문자열로 설정합니다 -v.

$ awk -F -v 'BEGIN{print FS}'
-v

dev=sd실행되어야 하는 스크립트로 구문 분석되기 때문에 그렇지 않습니다 . 어쨌든, 당신이 원하는 것은:

awk -F '/' -v dev=sd ' awk script here ' file

다음으로, / /사용 중인 컨텍스트의 구문에는 정규식이 필요합니다. 변수를 확장하지 않습니다. 또한 awk 변수는 로 시작하지 않습니다 $.필드하다. 사용자 정의 변수 var는 가 아닙니다 $var. 실제로 $var이는 "번호가 저장된 값인 필드"를 의미합니다 var. 따라서 이면 은 var=66 번째 필드의 값 $var입니다 .$6

반대로 변수를 일치시키려면 ~연산자가 필요합니다. 따라서 이 모든 것을 종합하면 내 추측으로는(입력이나 예상 출력을 표시하지 않았으므로 추측만 할 수 있음) 다음과 같은 것을 원할 것입니다.

lsblk -r --output NAME,MOUNTPOINT | 
  awk -F '/' -v dev=sd  '
    $0 ~ dev { 
     dsk=substr($1,1,3);
     dsks[dsk]+=1 
    } 
    END { 
     for ( i in dsks ) { 
      if (dsks[i]==1) print i 
     }
   }'

관련 정보