shell - 在多行输出中提取位于匹配模式上方且最接近匹配模式的字符串
问题描述
以下是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}'
上述命令的问题是,
中的值 4
grep -B
不能总是恒定的,因为匹配的磁盘可能在输出中的 Array 下排在第一位、第二位或第三位。输出中可能有多个可用的 RAID 阵列配置,因此可能有 Array
A
、B
等C
,我必须找到并检索Array
与我的输入磁盘匹配的最近的字符串
解决方案
我认为您的要求可以通过一次使用awk
. 您将磁盘名称存储为要传递的变量,并在浏览行列表时首先存储数组名称。一旦您匹配了实际的磁盘名称,您就可以打印刚刚存储的阵列。因此,将您的命令输出通过管道传输到
| awk -v disk="1I:1:1" '/^[[:space:]]*Array/{ array=$2; } $0 ~ disk { print array; exit }'
此答案假定数组名称不包含空格,否则它将被破坏并且仅打印数组名称的第一部分。
推荐阅读
- python - 切换到 64 位时出现 Python Winerror 193
- javascript - SyntaxError:输入 Discord Bot 意外结束
- java - 使用 Jsoup 非递归提取文本
- javascript - 如何在firebase登录或登录中设置或添加自定义提供程序名称,例如linkedin、instagram?
- c# - ScrapySharp 表单提交导致 System.AggregateException
- c# - 为什么将数据导出到 Excel 时日期格式会发生变化?
- python-3.x - Python中的闭包 - 执行内部函数?
- c# - 左上原点的 OpenTK 正交投影
- amp-html - 如何在 amp 电子邮件中收集和存储动态数据?
- shell - 输出到文件时shell换行的问题