You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:无法用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}
'

逻辑说明

  1. 精准触发:只在虚拟磁盘的Name字段严格匹配正则时,才开启目标块标记,避免误匹配块开头的Virtual Disk X行(比如补充示例里的块开头虽然有Virtual Disk 0,但Name是SYSTEM,不会被标记)
  2. 块边界控制:遇到下一个Virtual Disk开头的行时,关闭当前块标记,确保不会跨块捕获
  3. 保留最后值:每次捕获到Layout值时都会覆盖变量,最终输出的就是最后一个符合条件的块的Layout值
  4. 忽略大小写:通过IGNORECASE=1确保匹配不受大小写影响

内容的提问来源于stack exchange,提问作者SebMa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 03:35:27