VirtualBox 가상 머신의 UUID를 가져오기 위해 bash 함수를 작성하려고 합니다. 저는 이 분야에 익숙하지 않아서 awk
문제를 해결하기 위해 이를 사용하는 방법을 배우는 데 집중하려고 노력하고 있습니다. 나도 사용할 수 있다는 걸 sed
알아요cut
내 "원시" 출력은 다음과 같습니다 VBoxManage list vms
.
$ VBoxManage list vms
"FreeBSD" {1aac7062-bd59-47ee-9261-2f6aa8d9ef53}
"Windows 10" {64942de7-beb9-418c-9f52-5befcb6f577b}
"High Sierra" {07f73e1a-a0c4-4190-ade1-79a2e432b4d6}
"Test Machine" {9d0953a7-ca2a-4667-8c5b-1a9f550b2956}
내가 원하는 출력은 특정 가상 머신의 UUID를 얻는 것입니다. 이 경우 "테스트 머신"을 사용하여 찾고 있습니다 9d0953a7-ca2a-4667-8c5b-1a9f550b2956
(대괄호 {
및}
수많은 검색과 테스트 끝에 얻은 결론은
$ VBoxManage list vms | awk '/Test Machine/{ sub("{" ,""); sub("}", ""); print $3 }'
9d0953a7-ca2a-4667-8c5b-1a9f550b2956
sub
작동하지만 추출하려면 명령을 사용해야합니다 .
내 질문은 단순화하는 방법이 있습니까?치환유형 연산자를 사용한 작업의 일부 or
이므로 두 개의 명령을 사용할 필요가 없습니까 sub
?
예를 들어, 시도해 awk '/Test Machine/{ sub("{" || "}", ""); print $3'
도 작동하지 않습니다. 대괄호를 포함하여 전체 필드를 인쇄합니다.
{9d0953a7-ca2a-4667-8c5b-1a9f550b2956}
이 문자열을 추출하는 더 좋은 방법이 있습니까?
답변1
-F awk의 필드 구분 기호입니다. 여기서는 2개의 필드 구분 기호를 사용합니다. (둘 중 하나})
VBoxManage list vms | awk -F"[{}]" '/Test Machine/{print $2}'
답변2
다른 방법.
VBoxManage list vms | awk -F ' ' '{print substr($2, 2, length($2) - 2)}'
공백으로 필드 구분
awk -F ' '
두 번째 열을 인쇄하고 첫 번째 문자 {
와 마지막 }
문자를 제거합니다.
'{print substr($2, 2, length($2) - 2)}'
답변3
Gnu grep 사용(Perl 스타일 정규식 사용):
grep -Po "(?<={)[a-f0-9-]+(?=})"
...즉, 여는 중괄호 바로 뒤에 닫는 중괄호가 오는 일련의 16진수 숫자와 대시입니다.
간단한 grep 사용
grep -Eo "([a-f0-9-]+-){4}[a-f0-9-]+"
...즉, 대시로 구분된 16진수 숫자 5개 그룹입니다.
답변4
$ VBoxManage showvminfo 'Test Machine' --machinereadable | sed -n '/^UUID=/{ s///; s/"//gp; }'
1ce7ffef-8faa-4138-9b92-466698762f62
list vms
하위 명령을 사용하는 대신 showvminfo
특정 시스템(여기서는 VM이라고 함)에 대한 모든 정보를 가져옵니다 Test Machine
. 이를 사용하여 --machinereadable
쉽게 구문 분석할 수 있는 형식으로 데이터를 출력합니다. VM UUID는 다음과 같이 출력됩니다.
UUID="1ce7ffef-8faa-4138-9b92-466698762f62"
이 명령이 감지하는 내용 sed
. 해당 비트와 모든 큰따옴표를 제거한 UUID=
다음 남은 내용을 인쇄합니다.
이 sed
명령은 다양한 방법으로 작성할 수 있습니다. 예를 들어, 한 가지 변형은 다음과 같습니다.
sed -n 's/^UUID="\(.*\)"$/\1/p'