대괄호 [_] 사이를 검색하여 밑줄을 찾고 에코 결과 "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 _, 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 _]각 레이드 장치의 작동/작동 상태(작동 여부)를 나타내는 장치 상태 줄의 최종 항목에만 관심이 있다고 가정합니다. 질문에서 암시하지만 명시적으로 언급하지는 않습니다 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,}. 결과는 동일합니다. 이러한 정규식에 대한 내 스타일은 괄호를 사용하는 것입니다.

관련 정보