根据文件列表 grep 文件内容

根据文件列表 grep 文件内容

运行 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)

相关内容