当 UPS 使用电池时,我有每个 ESXI 的关闭脚本。我需要使这个脚本更好地读取可以在 ESXI 主机 UI 中设置的“stopDelay”。可以使用命令 vim-cmd 在控制台中找到该值。 我需要一个脚本,它将返回“stopDelay”以获取所需的 VM ID 作为输入参数。
例如:
[root@localhost:~] vim-cmd hostsvc/autostartmanager/get_autostartseq
(vim.host.AutoStartManager.AutoPowerInfo) [
(vim.host.AutoStartManager.AutoPowerInfo) {
key = 'vim.VirtualMachine:1',
startOrder = 1,
startDelay = 10,
waitForHeartbeat = "systemDefault",
startAction = "powerOn",
stopDelay = 13,
stopAction = "systemDefault"
},
(vim.host.AutoStartManager.AutoPowerInfo) {
key = 'vim.VirtualMachine:2',
startOrder = 2,
startDelay = -1,
waitForHeartbeat = "systemDefault",
startAction = "powerOn",
stopDelay = 5,
stopAction = "systemDefault"
},
(vim.host.AutoStartManager.AutoPowerInfo) {
key = 'vim.VirtualMachine:3',
startOrder = 3,
startDelay = -1,
waitForHeartbeat = "systemDefault",
startAction = "powerOn",
stopDelay = -1,
stopAction = "systemDefault"
}
]
如何解析此输出以获取 VM ID 及其 stopDelay 值? 等式:
./getVMStopDelay 1 => 13
./getVMStopDelay 2 => 5
./getVMStopDelay 3 => -1
我将利用 GNU
AWK
来完成此任务,让 file.txt
内容为
(vim.host.AutoStartManager.AutoPowerInfo) [
(vim.host.AutoStartManager.AutoPowerInfo) {
key = 'vim.VirtualMachine:1',
startOrder = 1,
startDelay = 10,
waitForHeartbeat = "systemDefault",
startAction = "powerOn",
stopDelay = 13,
stopAction = "systemDefault"
},
(vim.host.AutoStartManager.AutoPowerInfo) {
key = 'vim.VirtualMachine:2',
startOrder = 2,
startDelay = -1,
waitForHeartbeat = "systemDefault",
startAction = "powerOn",
stopDelay = 5,
stopAction = "systemDefault"
},
(vim.host.AutoStartManager.AutoPowerInfo) {
key = 'vim.VirtualMachine:3',
startOrder = 3,
startDelay = -1,
waitForHeartbeat = "systemDefault",
startAction = "powerOn",
stopDelay = -1,
stopAction = "systemDefault"
}
]
然后
awk 'index($0,"(vim.host.AutoStartManager.AutoPowerInfo)")>1{cnt+=1}/stopDelay/{sub(/,/,"");print "./getVMStopDelay",cnt,"=>",$NF}' file.txt
提供输出
./getVMStopDelay 1 => 13
./getVMStopDelay 2 => 5
./getVMStopDelay 3 => -1
index
函数来检测 (vim.host.AutoStartManager.AutoPowerInfo)
缩进的行,即开始位置在第一个字符之后,如果是这样,我会将 cnt
值增加 1。当我找到带有 stopDelay
的行时我使用空字符串替换 ,
,即删除它并使用 cnt
的值和最后一个字段的内容 ($NF
) 以符合您要求的格式打印。
(在 GNU Awk 5.1.0 中测试)