我的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,}
地写;结果是一样的。我对此类正则表达式的风格是使用括号。