여러 줄 출력에서 ​​일치하는 패턴에 가장 가깝고 위의 문자열을 추출합니다.

여러 줄 출력에서 ​​일치하는 패턴에 가장 가깝고 위의 문자열을 추출합니다.

아래는 HP새커리구성된 하드웨어 RAID 세부 정보를 보는 명령:

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그런 다음 위 명령의 출력에서 ​​해당 문자열을 검색해야 합니다. 디스크가 사용 가능하고 일치하므로 배열 이름을 추출해야 합니다(여기서 "') 이 어레이 매개변수를 얻은 후에는 계속해서 이 기존 RAID 구성을 삭제할 수 있습니다.

ssacli ctrl slot=0 show config | grep -B 4 '1I:1:1' | grep Array | awk '{print $2}'

위 명령의 문제점은,

  • 값 4 중간grep -B일치하는 디스크가 출력의 배열 아래에 첫 번째, 두 번째, 세 번째 등일 수 있기 때문에 항상 그런 것은 아닙니다.

  • 출력에 사용 가능한 여러 RAID 어레이 구성이 있을 수 있으므로 어레이가 있을 수 있습니다.,두번째,잠깐만요. 가장 가까운 것을 찾아서 가져와야 합니다."대량으로" 내 입력 디스크와 일치하는 문자열

답변1

다음 Perl oneliner는 파일을 한 줄씩 읽어 물리적 드라이브 "1I:1:1"에 대한 줄을 만날 때까지 마지막 배열을 기록합니다.

ssacli ctrl slot=0 show config | perl -ne 'if ($_ =~ /Array (.)/) { $array = $1; } elsif ($_ =~ /physicaldrive 1I:1:1/) { print $array; exit; }'

관련 정보