Estou tentando escrever uma função bash que obtém o UUID de uma VM do VirtualBox. Eu sou muito novo, awk
então estou tentando me concentrar em aprender como resolver o problema usando-o. Estou ciente de que posso usar sed
ou até mesmo cut
para resolver isso.
Minha saída "raw" do VBoxManage list vms
é a seguinte:
$ 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}
Minha saída desejada é apenas obter o UUID de uma determinada VM. Usando "Test Machine" para este caso, estou procurando 9d0953a7-ca2a-4667-8c5b-1a9f550b2956
(sem os colchetes {
e }
).
Depois de muito pesquisar e testar, cheguei a
$ VBoxManage list vms | awk '/Test Machine/{ sub("{" ,""); sub("}", ""); print $3 }'
9d0953a7-ca2a-4667-8c5b-1a9f550b2956
Funciona, mas tenho que usar sub
comandos para extraí-lo.
Minha pergunta é, existe uma maneira de simplificar a parte de substituição da ação com um or
operador de tipo para que eu não precise usar dois sub
comandos?
Por exemplo, se eu tentar awk '/Test Machine/{ sub("{" || "}", ""); print $3'
, não funciona - ele imprime todo o campo, incluindo os colchetes.
{9d0953a7-ca2a-4667-8c5b-1a9f550b2956}
Existe uma maneira melhor de extrair essa string?
-F separador de campo em awk. Aqui estamos usando 2 separadores de campo. (ou } )
Outra maneira.
Campos separados por espaço vazio
Imprima a segunda coluna removendo o primeiro
{
e o último}
caractereCom Gnu grep (usa Perl-stye regex):
... em outras palavras, qualquer sequência de dígitos hexadecimais e traço, ocorrendo após uma chave de abertura e imediatamente seguida por uma chave de fechamento.
Com grep simples
... ou seja, 5 grupos de dígitos hexadecimais separados por traços.
resultado
Em vez de usar o
list vms
subcomando, ele usa o subcomandoshowvminfo
, que obtém todas as informações de uma determinada máquina (aqui uma VM chamadaTest Machine
). Com--machinereadable
, isso gera os dados em um formato que é facilmente analisável. O UUID das VMs será gerado comoque o
sed
comando detecta. Ele remove oUUID=
bit e todas as aspas duplas e, em seguida, imprime o que resta.O
sed
comando pode ser escrito de várias maneiras diferentes. Uma variação é, por exemplo,Aqui está como eu faria isso usando a sintaxe PE e bash.
Você pode iniciar o vms dentro do loop com uma correspondência usando um teste ou salvar a saída em array e assim por diante. Também deve ser seguro, mesmo que o nome da vm tenha um
{
ou}
em seu nome. Eu tenho usado esse código no meu script desde 2013 :-)