提取多行输出中位于匹配模式上方且最接近匹配模式的字符串

提取多行输出中位于匹配模式上方且最接近匹配模式的字符串

下面是惠普萨克利命令查看配置的硬件 RAID 详细信息:

ssacli ctrl slot=0 show config

其输出如下:

HPE Smart Array P408i-a SR Gen10 in Slot 0 (Embedded)



   Internal Drive Cage at Port 1I, Box 1, OK



   Internal Drive Cage at Port 2I, Box 0, OK


   Port Name: 1I (Mixed)

   Port Name: 2I (Mixed)

   Array A (Solid State SAS, Unused Space: 0  MB)

      logicaldrive 1 (447.10 GB, RAID 1, OK)

      physicaldrive 1I:1:1 (port 1I:box 1:bay 1, SAS SSD, 480 GB, OK)
      physicaldrive 1I:1:2 (port 1I:box 1:bay 2, SAS SSD, 480 GB, OK)

   SEP (Vendor ID HPE, Model Smart Adapter) 379  (Port: Unknown)

我必须弄清楚大批名称,以便通过搜索我从用户输入获得的匹配磁盘信息来删除它。例如,如果磁盘输入是1I:1:1然后我必须在上述命令的输出中搜索该字符串。由于该磁盘可用且匹配,我必须提取阵列名称(此处为“A')一旦我得到这个阵列参数,我就可以继续删除这个现有的 RAID 配置。

ssacli ctrl slot=0 show config | grep -B 4 '1I:1:1' | grep Array | awk '{print $2}'

上述命令的问题是,

  • 值 4 中grep -B不能始终保持不变,因为匹配的磁盘可能位于输出中阵列下的第一、第二或第三等位置。

  • 输出中可能有多个可用的 RAID 阵列配置,因此可能有 ArrayA,,C等等,我必须找到并检索最近的“大批" 与我的输入磁盘匹配的字符串

答案1

以下 perl oneliner 逐行读取文件,记录最后一个数组,直到遇到物理驱动器“1I:1:1”的行:

ssacli ctrl slot=0 show config | perl -ne 'if ($_ =~ /Array (.)/) { $array = $1; } elsif ($_ =~ /physicaldrive 1I:1:1/) { print $array; exit; }'

相关内容