运行 CentOS 6.5,qemu-kvm。
我有一个脚本可以构建正在运行的虚拟机的列表。我想仅从正在运行的虚拟机的 .xml 文件中提取信息。
cat /dev/null > /<path>/runlist virsh list --all|grep running|awk -F" " '{print $2}' > /<path>/runlist.tmp
现在我有了正在运行的虚拟机的列表,我想将它们与目录列表中相应的 .xml 文件进行匹配,该目录列表包括我们所有虚拟机的 .xml 文件并提取一些信息。
我知道我可以:
grep <info> </path/file.xml>
但是我如何获得中间位,该中间位将根据目录列表解析运行列表文件,并且仅从与正在运行的虚拟机相关的文件中搜索信息。
示例 xml 文件:
<domain type='kvm'>
<name>"X"</name>
<uuid>"X"</uuid>
<memory unit='KiB'>"X"</memory>
<currentMemory unit='KiB'>"X"</currentMemory>
<vcpu placement='static'>1</vcpu>
<os>
<type arch='x86_64' machine='X'>hvm</type>
<boot dev='hd'/>
</os>
<features>
<acpi/>
<apic/>
<pae/>
</features>
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>restart</on_crash>
<devices>
<emulator>/<path>/qemu-kvm</emulator>
<disk type='file' device='disk'>
<driver name='qemu' type='raw' cache='none'/>
<source file='/path/file.img'/>
<target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
</disk>
<controller type='usb' index='0'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
</controller>
<interface type='bridge'>
<mac address='X'/>
<source bridge='br1'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
<serial type='pty'>
<target port='0'/>
</serial>
<console type='pty'>
<target type='serial' port='0'/>
</console>
<input type='tablet' bus='usb'/>
<memballoon model='virtio'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
</memballoon>
</devices>
</domain>
答案1
你的问题的直接答案是
grep -f /path/to/runlist /path/to/file.xml
但我认为这是一个XY问题: 不假思索如何为了解决这个问题,你想做什么?
鉴于这runlist
是一个包含 xml 文件名的文件,我将使用 xml 处理工具(例如xmlstarlet)提取 vcpu:
$ cat runlist
sample1.xml
sample2.xml
$ xmlstarlet sel -t -v /domain/name -o $'\t' -v /domain/currentMemory -o $'\t' -v /domain/vcpu -nl $(< ./runlist)
"X" "X" 1
"XX" 256 16
答案2
看来您只想从运行列表中的文件列表中获取信息。你可以:
grep <info> -- $(cat runlist)