使用awk提取不同字符之间的字符串

All*_*lan 4 bash awk macos

我正在尝试编写一个 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)