다음 명령의 텍스트 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=6
6 번째 필드의 값 $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
}
}'