在括号[_]之间搜索找到下划线并输出回显结果“OK”或“FAIL”

在括号[_]之间搜索找到下划线并输出回显结果“OK”或“FAIL”

我的cat /proc/mdstat输出如下。如果_任何[]括号之间有下划线,我只想导出 echo“OK”或“FAIL”。我该怎么做呢?

[root@srv4 ~]# cat /proc/mdstat
Personalities : [raid1] [raid10]
md6 : active raid10 sda6[0] sdd6[3] sdb6[1] sdc6[2]
      7237440512 blocks 512K chunks 2 near-copies [4/4] [UUUU]
      bitmap: 0/54 pages [0KB], 65536KB chunk

md5 : active raid10 sdb5[1] sda5[0] sdc5[2] sdd5[3]
      153594880 blocks 512K chunks 2 near-copies [4/4] [UUUU]

md3 : active raid1 sda3[0] sdc3[2] sdb3[1] sdd3[3]
      209918912 blocks [4/4] [UUUU]
      bitmap: 2/2 pages [8KB], 65536KB chunk

md2 : active raid1 sdd2[3] sdc2[2] sda2[0] sdb2[1]
      523200 blocks [4/4] [UUUU]
[root@srv2 public]# cat /proc/mdstat
Personalities : [raid1]
md6 : active raid1 sda6[0] sdb6[1]
      1588416448 blocks [2/2] [UU]
      bitmap: 0/12 pages [0KB], 65536KB chunk

md5 : active raid1 sdb5[1] sda5[0]
      153597888 blocks [2/2] [UU]
      bitmap: 0/2 pages [0KB], 65536KB chunk

md3 : active raid1 sda3[0] sdb3[1]
      209918912 blocks [2/2] [UU]
      bitmap: 1/2 pages [4KB], 65536KB chunk

md2 : active raid1 sda2[0] sdb2[1]
      523200 blocks [2/2] [UU]

更有可能的是,[_UU]或者[_UUUU]

预期结果:

if there is no [_] between any of brackets is "OK" 
if there is [_] between any of brackets is "FAIL"

答案1

一个简单的解决方案是

#!/bin/sh
if grep -q '\[.*_.*]' /proc/mdstat
then
        echo FAIL
else
        echo OK
fi

这只是检查输入中的任何行是否按顺序包含 a [、后跟_、后跟 a ],但(可能)与其他字符混合。作为一个简单的解决方案,它是不完美的;它认为

sda6[0] _sdb6[1]

以匹配模式。

这个版本:

#!/bin/sh
if grep -q '\[[^]]*_.*]' /proc/mdstat
then
        echo FAIL
else
        echo OK
fi

要求后面[跟着一个_ 没有中间]字符_(保留最终后跟 的 要求 ]。这仍然有效

sda6[0_ sdb6[1]

因为_括号之间有一个。就我而言,此输入的解释是不明确的,我并不关心,因为问题没有说明如何处理格式错误的数据。

答案2

在 PCRE 模式下使用 GNU grep...

假设您实际上只对设备状态行上的最终条目感兴趣,即[some_combination_of U and _]代表每个 raid 设备的启动/关闭状态,无论是U启动还是_关闭 - 您的问题暗示但没有明确说明。

#!/bin/bash

if grep -Pq '\[[[:alpha:]]*?(_){1,}[[:alpha:]]*?\]' /proc/mdstat
then
    echo "FAIL"
else
    echo "OK"
fi

如果您确实希望方括号内包含“_”的所有实例:

#!/bin/bash

if grep -Pq '\[[^]](_){1,}.*?\]' /proc/mdstat
then
    echo "FAIL"
else
    echo "OK"
fi

你可以(_){1,}随心所欲_{1,}地写;结果是一样的。我对此类正则表达式的风格是使用括号。

相关内容