首页 > 解决方案 > 在多行输出中提取位于匹配模式上方且最接近匹配模式的字符串

问题描述

以下是ssacli用于查看已配置硬件 RAID 详细信息的 HP 命令:

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}'

上述命令的问题是,

  1. 中的值 4grep -B不能总是恒定的,因为匹配的磁盘可能在输出中的 Array 下排在第一位、第二位或第三位。

  2. 输出中可能有多个可用的 RAID 阵列配置,因此可能有 Array ABC,我必须找到并检索Array与我的输入磁盘匹配的最近的字符串

标签: shellawk

解决方案


我认为您的要求可以通过一次使用awk. 您将磁盘名称存储为要传递的变量,并在浏览行列表时首先存储数组名称。一旦您匹配了实际的磁盘名称,您就可以打印刚刚存储的阵列。因此,将您的命令输出通过管道传输到

| awk -v disk="1I:1:1" '/^[[:space:]]*Array/{ array=$2; } $0 ~ disk { print array; exit  }' 

此答案假定数组名称不包含空格,否则它将被破坏并且仅打印数组名称的第一部分。


推荐阅读