首页 > 解决方案 > 如果 != 从输出/文件中提取值并通过管道发送到电子邮件

问题描述

我有一台安装了 hwraid (megaclisas) 的服务器https://hwraid.le-vert.net/wiki/DebianPackages

示例输出如下所示:

-- Controller information --
-- ID | H/W Model      | RAM    | Temp | BBU    | Firmware     
c0    | PERC H310 Mini | 0MB    | 59C  | Absent | FW: 20.13.3-0001 

-- Array information --
-- ID | Type    |    Size |  Strpsz | Flags | DskCache |   Status |  OS Path | CacheCade |InProgress   
c0u0  | RAID-10 |   3272G |   64 KB | RA,WT |  Default |  Optimal | /dev/sda | None      |None         

-- Disk information --
-- ID    | Type | Drive Model                      | Size     | Status          | Speed    | Temp | Slot ID  | LSI ID  
c0u0s0p0 | HDD  | SEAGATE ST900MM0006 LS0AS0N3Bxxx | 837. Gb  | Online, Spun Up | 6.0Gb/s  | 31C  | [32:0]   | 0       
c0u0s0p1 | HDD  | SEAGATE ST900MM0006 LS0AS0N3Bxxx | 837. Gb  | Online, Spun Up | 6.0Gb/s  | 31C  | [32:1]   | 1       
c0u0s1p0 | HDD  | SEAGATE ST900MM0006 LS0AS0N3Bxxx | 837. Gb  | Online, Spun Up | 6.0Gb/s  | 28C  | [32:2]   | 2       
c0u0s1p1 | HDD  | SEAGATE ST900MM0006 LS0AS0N3Bxxx | 837. Gb  | Online, Spun Up | 6.0Gb/s  | 30C  | [32:3]   | 3       
c0u0s2p0 | HDD  | SEAGATE ST900MM0006 LS0AS0N3Bxxx | 837. Gb  | Online, Spun Up | 6.0Gb/s  | 29C  | [32:4]   | 4       
c0u0s2p1 | HDD  | SEAGATE ST900MM0006 LS0AS0N3Bxxx | 837. Gb  | Online, Spun Up | 6.0Gb/s  | 31C  | [32:5]   | 5       
c0u0s3p0 | HDD  | SEAGATE ST900MM0006 LS0AS0N3Bxxx | 837. Gb  | Online, Spun Up | 6.0Gb/s  | 30C  | [32:7]   | 7       
c0u0s3p1 | HDD  | SEAGATE ST900MM0006 LS0AS0N3Bxxx | 837. Gb  | Online, Spun Up | 6.0Gb/s  | 28C  | [32:6]   | 6   

我想要实现的是 grep Status 值,如果它不等于 Optimal 或 Online,然后通过管道发送到电子邮件。我在这里遇到的问题是如何使用 sed 或 awk 来获得它。

标签: bashawksed

解决方案


这是一个解决方案如何进行

data=$(mktemp)
externalprogram > $data
RESULT=$(
    grep "| RAID" $data | sed -n '/Optimal/!p'
    grep "| HDD" $data | sed -n '/Online,/!p'
)
rm $data
echo "$RESULT"

解释

  • grep 感兴趣的行
  • 如果未找到搜索模式则打印

推荐阅读