파일 목록을 기반으로 한 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 문제: 생각하지 않고서어떻게이 문제를 해결하기 위해 무엇을 하시겠습니까?


runlistxml 파일 이름이 포함된 파일이므로 다음과 같은 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)

관련 정보