求助:无法用gawk在指定Virtual Disk块中提取Layout值
提取最后一个匹配正则的虚拟磁盘块中的Layout值
需求
从omreport storage vdisk controller=0的输出里,筛选出**名称匹配正则/virtual\s*disk\s*[0-9]+/**的虚拟磁盘块;如果有多个符合条件的块,取最后一个块里的Layout对应值。
示例数据
符合匹配规则的块
# omreport storage vdisk controller=0 vdisk=16 Virtual Disk 16 on Controller PERC H730 Mini (Embedded) Controller PERC H730 Mini (Embedded) ID : 16 Status : Ok Name : Virtual Disk 16 State : Ready Hot Spare Policy violated : Not Applicable Encrypted : No Layout : RAID-0 Size : 3,725.50 GB (4000225165312 bytes) T10 Protection Information Status : No Associated Fluid Cache State : Not Applicable Device Name : /dev/sdp Bus Protocol : SAS Media : HDD Read Policy : Read Ahead Write Policy : Force Write Back Cache Policy : Not Applicable Stripe Element Size : 64 KB Disk Cache Policy : Disabled #
不符合匹配规则的块(名称为SYSTEM)
# omreport storage vdisk controller=0 vdisk=0 Virtual Disk 0 on Controller PERC H730 Mini (Embedded) Controller PERC H730 Mini (Embedded) ID : 0 Status : Ok Name : SYSTEM State : Ready Hot Spare Policy violated : Not Assigned Encrypted : No Layout : RAID-1 Size : 465.25 GB (499558383616 bytes) T10 Protection Information Status : No Associated Fluid Cache State : Not Applicable Device Name : /dev/sda Bus Protocol : SATA Media : HDD Read Policy : Read Ahead Write Policy : Write Back Cache Policy : Not Applicable Stripe Element Size : 64 KB Disk Cache Policy : Disabled #
当前尝试的命令
omreport storage vdisk controller=0 | gawk 'BEGIN{IGNORECASE=1}/virtual\s*disk\s*[0-9]+/{inBlock=1}! /virtual\s*disk\s*[0-9]+/{inBlock=0}inBlock == 1 && /Layout/{value=$NF}END{print value}'
期望结果
RAID-0
问题修正
原命令逻辑错误:只要遇到不匹配正则的行就立即关闭inBlock标记,导致刚进入匹配块后,下一行就退出,根本捕获不到块内的Layout行。
修正后的命令:
omreport storage vdisk controller=0 | gawk ' BEGIN{IGNORECASE=1} # 仅当Name字段匹配目标正则时,标记进入目标块 /^Name\s*:\s*virtual\s*disk\s*[0-9]+$/ { inTargetBlock = 1 next } # 遇到新的Virtual Disk块起始行,退出当前块 /^Virtual Disk/ { inTargetBlock = 0 } # 在目标块内捕获Layout值,每次覆盖保留最后一个 inTargetBlock && /^Layout\s*:/ { value = $NF } END{print value} '
逻辑说明
- 精准触发:只在虚拟磁盘的
Name字段严格匹配正则时,才开启目标块标记,避免误匹配块开头的Virtual Disk X行(比如补充示例里的块开头虽然有Virtual Disk 0,但Name是SYSTEM,不会被标记) - 块边界控制:遇到下一个
Virtual Disk开头的行时,关闭当前块标记,确保不会跨块捕获 - 保留最后值:每次捕获到Layout值时都会覆盖变量,最终输出的就是最后一个符合条件的块的Layout值
- 忽略大小写:通过
IGNORECASE=1确保匹配不受大小写影响
内容的提问来源于stack exchange,提问作者SebMa
相关产品推荐
相关产品推荐

