我在 govc govmomi github 页面上发现以下内容,它允许我通过 MAC 地址搜索虚拟机:
govc object.collect -json -type m / config.hardware.device \
| jq -r '
.
| select(.ChangeSet[].Val.VirtualDevice[].MacAddress == "00:50:56:bc:5e:3c")
| [.Obj.Type, .Obj.Value]
| join(":")
' \
| xargs govc ls -L
请参阅附件中足够的 govc 输出片段:
{
"Obj": {
"Type": "VirtualMachine",
"Value": "vm-666"
},
"ChangeSet": [
{
"Val": {
"VirtualDevice": [
{
},
{
"MacAddress": "00:50:56:bc:5e:3c"
}
]
}
}
]
}
我面临的问题是,有些 MAC 包含大写字母,有些包含小写字母,而且我事先不知道哪台机器使用哪种方案。我不知道如何使大小写==
不敏感。
我在 stackoverflow 上找到了建议使用ascii_downcase
过滤器的答案,但我不知道如何使用它==
。
https://stackoverflow.com/a/62454688中建议的语法给了我一系列explode input must be a string
错误(govc 输出每行 1 个)。
如果这对本练习很重要:这发生在Mac OS 15.1
,jq
是通过 brew 安装的,版本是1.7.1
。
假设将 MacAddress 规范化为 ascii_downcase 就足够了,一种方法是添加预处理过滤器,
walk
如下所示:您可能需要一种更有针对性的方法,但以上内容仍可作为指导。(*)
另一种方法是使用基于正则表达式的匹配,并使用“i”选项“忽略大小写”,即 test(_,"i")。在
ascii_downcase
不符合要求的情况下,建议采用这种方法。else .
(*) 如果您的 jq 足够过时,您也必须将其包括在内。这是因为您的某个设备没有该
MacAddress
字段,并且ascii_downcase
仅支持字符串,而不支持null
。要解决此问题,您可以使用
// ""
[ doc link ] 默认为空字符串,然后将其传递ascii_downcase
:每个
…[]
in.ChangeSet[].Val.VirtualDevice[].MacAddress
都会创建一个可能包含多个结果的流。在给定的示例中,.ChangeSet[]
生成一个项目,并且(对于每个项目).Val.VirtualDevice
计算为两个项目,从而创建两个项目的组合流。如果您想将此流简化为二元决策(只有零个或一个项目),请使用执行此转换的聚合函数。例如,如果您想select
在至少其中一个通过测试时返回一个项目,请使用any
函数。(此外,我
strings
更喜欢// ""
,因此没有 的项目.MacAddress
会被立即过滤掉,而不是用空字符串替换它们,而空字符串只有在与另一个文字字符串进行比较时才会失败。)演示