修剪文本表并将值存储为变量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了修剪文本表并将值存储为变量相关的知识,希望对你有一定的参考价值。

我正在尝试编写一个可以在我的FreeNas(FreeBSD)框上运行的脚本,该框通过SSH连接到ESXi主机并正常关闭虚拟机。我需要为VM ID列表运行的是:

vim-cmd vmsvc/power.shutdown VMID

在过滤用于检索ID的命令的输出,然后将其传递给shutdown命令的一些帮助之后。

检索所有VM的命令是:

vim-cmd vmsvc/getallvms

它输出如下数据:

Vmid     Name                          File                             Guest OS          Version   Annotation
12     Eds-LINUX   [Eds-FS-Datastore-1] Eds-LINUX/Eds-LINUX.vmx   ubuntu64Guest           vmx-13
13     Eds-RT      [Eds-FS-Datastore-1] Eds-RT/Eds-RT.vmx         freebsd64Guest          vmx-13
14     Eds-DC      [Eds-FS-Datastore-1] Eds-DC/Eds-DC.vmx         windows9Server64Guest   vmx-13
15     Eds-STEAM   [Eds-FS-Datastore-1] Eds-STEAM/Eds-STEAM.vmx   windows9_64Guest        vmx-13
16     Eds-DL      [Eds-FS-Datastore-1] Eds-DL/Eds-DL.vmx         windows9Server64Guest   vmx-13
17     Eds-RD      [Eds-FS-Datastore-1] Eds-RD/Eds-RD.vmx         windows9Server64Guest   vmx-13
18     Eds-PLEX    [Eds-FS-Datastore-1] Eds-PLEX/Eds-PLEX.vmx     windows9Server64Guest   vmx-13
19     Eds-MC      [Eds-FS-Datastore-1] Eds-MC/Eds-MC.vmx         windows9Server64Guest   vmx-13
2      Eds-FS      [Eds-ESXi-Datastore-1] Eds-FS/Eds-FS.vmx       freebsd64Guest          vmx-13

我已经确定我可以使用管道进入sed,删除第一行,使用:

vim-cmd vmsvc/getallvms | sed '1d'

然后,我可以使用以下命令检索要过滤掉的VM的ID:

vim-cmd vmsvc/getallvms | awk '/Eds-FS.vmx/{print$1}'

这给了我2的ID。然而,我不清楚如何将它存储在变量中供以后使用。

我需要知道一种从这个数据中选择第一列的方法,并且对于列表中的每个ID,将它放在一个数组中。然后我需要遍历数组并为每个ID运行以下命令以获取VM的电源状态:

vim-cmd vmsvc/power.getstate VMID

这样输出数据,状态为开启或关闭:

Retrieved runtime info
Powered on

对于每个被启动的设备,我需要将VM ID存储在第二个阵列中,以便稍后传递给shutdown命令,除非ID等于我想要关闭的VM的ID。

答案

要列出第一列中的ID,请使用awk,如下所示:

vim-cmd vmsvc/getallvms | awk 'NR>1{print $1}'

要在shell数组中存储ID,请使用:

readarray -t arr < <(vim-cmd vmsvc/getallvms | awk 'NR>1{print $1}')

循环遍历数组并运行另一个命令:

for id in "${arr[@]}"; do
   vim-cmd vmsvc/power.getstate "$id"
done

要存储一个特定的id,请使用命令替换:

vmid1=$(vim-cmd vmsvc/getallvms | awk '/Eds-FS.vmx/{print$1}')
另一答案

感谢anubhava给了我足够的帮助以获得一些工作(尽管可能没有遵循标准或最佳实践)

我将此脚本保存在我的ESXi主机上,我使用SSH连接并触发运行:

freenasid=`vim-cmd vmsvc/getallvms | sed '1d' | awk '/Eds-FS.vmx/{print$1}'`
vmids=`vim-cmd vmsvc/getallvms | sed '1d' | awk '{print$1}'`
for vmid in $vmids
do
if [ $vmid != $freenasid ]
then
powerstate=`vim-cmd vmsvc/power.getstate $vmid | sed '1d'`
if [ "$powerstate" = "Powered on" ]
then
onvmids="$onvmids $vmid"
fi
fi
done
for vmid in $onvmids
do
vim-cmd vmsvc/power.shutdown $vmid
done
exit 0

这会正确关闭所有正在运行的VM。

以上是关于修剪文本表并将值存储为变量的主要内容,如果未能解决你的问题,请参考以下文章

设置文本表 hsqldb Java

如何从 Javascript 中获取值以输入文本表单?

在 Python 中将文本表转换为 CSV

Tableau - YTD,MTD 作为文本表中的列

将文本表的数据导出为 .csv (Tableau)

如何改进我的代码以从文本表填充数组?