我正在尝试编写一个获取 VirtualBox VM 的 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}
我想要的输出是获取特定 VM 的 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}
有没有更好的方法来提取该字符串?
-F awk 中的字段分隔符。这里我们使用 2 个字段分隔符。(两者任一 } )
另一种方式。
用空格分隔字段
打印第二列删除第一个
{
和最后一个}
字符使用 Gnu grep(使用 Perl-stye 正则表达式):
...换句话说,任何十六进制数字和破折号序列,出现在左大括号之后,紧随其后的是右大括号。
用普通的 grep
... 即,由破折号分隔的 5 组十六进制数字。
输出
这不是使用
list vms
子命令,而是使用子命令showvminfo
,它获取特定机器(这里称为 VMTest Machine
)的所有信息。使用--machinereadable
,这会以易于解析的形式输出数据。虚拟机 UUID 将像这样输出该
sed
命令检测到的。它删除该UUID=
位和所有双引号,然后打印剩下的任何内容。该
sed
命令可以以多种不同的方式编写。例如,一个变体是,以下是我使用 PE 和 bash 语法的方法。
您可以使用测试以匹配方式启动循环内的 vms,或者将输出保存在数组中等等。即使 vm 名称中包含
{
or}
,它也应该是安全的。自 2013 年以来,我一直在我的脚本中使用该代码 :-)