grep conteúdo dos arquivos com base em uma lista de arquivos

1

Executando o CentOS 6.5, qemu-kvm.

Eu tenho um script que cria uma lista de VMs em execução. Eu quero extrair informações desses arquivos .xml de apenas as VMs que estão em execução.

cat /dev/null > /<path>/runlist virsh list --all|grep running|awk -F" " '{print $2}' > /<path>/runlist.tmp

Agora que tenho a lista de execuções de VMs, desejo combiná-las com seus arquivos .xml apropriados em uma listagem de diretórios que inclua os arquivos .xml de todos os nossos VMs e retire as informações.

Eu sei que posso:

grep <info> </path/file.xml>

Mas como obtenho aquele bit do meio que analisará o arquivo da lista de execução na listagem de diretórios e só procurará as informações dos arquivos pertinentes às VMs em execução.

Exemplo de arquivo 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>
    
por Matthew Lee Allen-Goebel 26.08.2014 / 17:59

2 respostas

3

A resposta direta à sua pergunta é

grep -f /path/to/runlist /path/to/file.xml

Mas acho que essa é uma pergunta XY : sem pensar em < strong> how para resolver a questão, o que você está tentando fazer?

Como runlist é um arquivo contendo nomes de arquivos xml, eu usaria uma ferramenta de processamento xml (como xmlstarlet ) para extrair o 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
    
por 26.08.2014 / 18:22
0

Parece que você só deseja obter informações da lista de arquivos na lista de execução. Você pode:

grep <info> -- $(cat runlist)
    
por 26.08.2014 / 18:49

Tags