我正在尝试编写一个 bash 函数来获取 VirtualBox VM 的 UUID。我很新,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}
Run Code Online (Sandbox Code Playgroud)
我想要的输出只是获取特定 VM 的 UUID。在这种情况下使用“测试机”,我正在寻找9d0953a7-ca2a-4667-8c5b-1a9f550b2956(没有括号{和})。
经过相当多的搜索和测试,我想出了
$ VBoxManage list vms | awk '/Test Machine/{ sub("{" ,""); sub("}", ""); print $3 }'
9d0953a7-ca2a-4667-8c5b-1a9f550b2956
Run Code Online (Sandbox Code Playgroud)
它有效,但我必须使用sub命令来提取它。
我的问题是,有没有办法用类型运算符简化操作的替换部分,or这样我就不必使用两个sub命令?
例如,如果我尝试awk '/Test Machine/{ sub("{" || "}", ""); print $3'它不起作用 - 它会打印包括括号在内的整个字段。
{9d0953a7-ca2a-4667-8c5b-1a9f550b2956}
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来提取该字符串?
小智 8
-F awk 中的字段分隔符。这里我们使用了 2 个字段分隔符。(两者任一 } )
VBoxManage list vms | awk -F"[{}]" '/Test Machine/{print $2}'
Run Code Online (Sandbox Code Playgroud)