Warm tip: This article is reproduced from serverfault.com, please click

awk-从配置文件中提取并打印所有出现的磁盘文件(.img)

(awk - extract and print all occurrences of disk file (.img) from a configuration file)

发布于 2020-12-01 19:43:53

我有vm配置文件,需要从中打印每个文件中存在的所有磁盘(26个字母数字字符,后跟.img)。

这是其中一个文件的摘录

[root@~]# cat demo_vm.cfg
disk = ['file:/OVS/Repositories/0004fb00000300007b8afb76a3377693/VirtualDisks/0004fb0000120000a17dfe12ac74818f.img,xvda,w', 'file:/OVS/Repositories/0004fb00000300007b8afb76a3377693/VirtualDisks/0004fb0000120000e66ace31dac64d98.img,xvdb,w', 'file:/OVS/Repositories/0004fb00000300007b8afb76a3377693/VirtualDisks/0004fb000012000082fbb45a02e24096.img,xvdd,w']

我想提取以下内容(文件中26alphanum.img的所有引用):

0004fb0000120000a17dfe12ac74818f.img
0004fb0000120000e66ace31dac64d98.img
0004fb000012000082fbb45a02e24096.img

有些文件有3个磁盘,有些文件只有一个,我通常为此运行并拥有所需的磁盘,但是如果出现多次,我只能打印第一个磁盘。

# awk -F [/,] '/disk/ { print $6}' demo_vm.cfg
0004fb0000120000a17dfe12ac74818f.img

在此先感谢你花了数小时尝试拆分和正则表达式模式,但没有最终结果。这是我在SOverflow中的第一个问题。

编辑

这是放在单独文件中的3种类型的内容(1 = 1个26#.img出现,2 = 2个26#.img出现,3 = 3个26#.img出现)

# cat demo_vm_1.cfg
disk = ['file:/OVS/Repositories/0004fb00000300007b8afb76a3377693/VirtualDisks/0004fb000012000065a82a4df5e7112b.img,xvda,w']
[root ~]# cat demo_vm_2.cfg
disk = ['file:/OVS/Repositories/0004fb0000030000a079ca25909e5455/VirtualDisks/0004fb0000120000822cb8b0602ee042.img,xvda,w', 'file:/OVS/Repositories/0004fb0000030000a079ca25909e5455/VirtualDisks/0004fb000012000073d5fd864a0ba6b1.img,xvdb,w']
# cat demo_vm_3.cfg
disk = ['file:/OVS/Repositories/0004fb00000300007b8afb76a3377693/VirtualDisks/0004fb0000120000a17dfe12ac74818f.img,xvda,w', 'file:/OVS/Repositories/0004fb00000300007b8afb76a3377693/VirtualDisks/0004fb0000120000e66ace31dac64d98.img,xvdb,w', 'file:/OVS/Repositories/0004fb00000300007b8afb76a3377693/VirtualDisks/0004fb000012000082fbb45a02e24096.img,xvdd,w']
  • 初始脚本

当cfg有多个磁盘引用时,为.cfg文件创建删除命令的初始脚本以及其中每个文件中的指向图像都存在问题。我想我现在可以适应它以使用grep -Eo而不是awk

  
strings=(`find  /vm_backup/VirtualMachines/*/vm.cfg`)                                                             
for i in "${strings[@]}"; do                                                                                      
echo "rm -f $i" >> drop_vm_final.sh                                                                               
awk -F [/,] '/disk/ { print $6}' "$i" | awk '{print "rm -f  /vm_backup/VirtualDisks/"$0}'  >>drop_vm_bkp_final.sh 
done                                                                                                              

Questioner
koss
Viewed
0
Ed Morton 2020-12-02 03:50:42
$ grep -Eo '[[:alnum:]]{26}\.img' file
0000120000a17dfe12ac74818f.img
0000120000e66ace31dac64d98.img
000012000082fbb45a02e24096.img

如果这还不是你所需要的,那么请编辑你的问题,以提供更实际的代表性示例输入/输出,该输入/输出不起作用。