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)