잃어버린 번호를 찾는 더 효율적인 방법

잃어버린 번호를 찾는 더 효율적인 방법

DISK_INFO다음 내용으로 호출되는 변수가 있습니다 .

diskid   HGST     HUSMH8010BSS204  serial             no  no  [0] Slot00
diskid   HGST     HUH728080AL4204  serial             no  no  [0] Slot02
diskid   HGST     HUH728080AL4204  serial             no  no  [0] Slot03
diskid   HGST     HUH728080AL4204  serial             no  no  [0] Slot04
diskid   HGST     HUH728080AL4204  serial             no  no  [0] Slot05
diskid   HGST     HUH728080AL4204  serial             no  no  [0] Slot06
diskid   HGST     HUH728080AL4204  serial             no  no  [0] Slot07
diskid   HGST     HUH728080AL4204  serial             no  no  [0] Slot08
diskid   HGST     HUH728080AL4204  serial             no  no  [0] Slot09
diskid   HGST     HUH728080AL4204  serial             no  no  [0] Slot10
diskid   HGST     HUH728080AL4204  serial             no  no  [0] Slot11
diskid   HGST     HUH728080AL4204  serial             no  no  [0] Slot12
diskid   HGST     HUH728080AL4204  serial             no  no  [0] Slot13
diskid   HGST     HUH728080AL4204  serial             no  no  [0] Slot14
diskid   HGST     HUH728080AL4204  serial             no  no  [0] Slot15
diskid   HGST     HUH728080AL4204  serial             no  no  [0] Slot16
diskid   HGST     HUH728080AL4204  serial             no  no  [0] Slot17
diskid   HGST     HUH728080AL4204  serial             no  no  [0] Slot18
diskid   HGST     HUH728080AL4204  serial             no  no  [0] Slot19
diskid   HGST     HUH728080AL4204  serial             no  no  [0] Slot20
diskid   HGST     HUH728080AL4204  serial             no  no  [0] Slot21
diskid   HGST     HUH728080AL4204  serial             no  no  [0] Slot22
diskid   HGST     HUH728080AL4204  serial             no  no  [0] Slot23
diskid   HGST     HUH728080AL4204  serial             no  no  [1] Slot00
diskid   HGST     HUH728080AL4204  serial             no  no  [1] Slot01
diskid   HGST     HUH728080AL4204  serial             no  no  [1] Slot02
diskid   HGST     HUH728080AL4204  serial             no  no  [1] Slot03
diskid   HGST     HUH728080AL4204  serial             no  no  [1] Slot04
diskid   HGST     HUH728080AL4204  serial             no  no  [1] Slot05
diskid   HGST     HUH728080AL4204  serial             no  no  [1] Slot06
diskid   HGST     HUH728080AL4204  serial             no  no  [1] Slot07
diskid   HGST     HUH728080AL4204  serial             no  no  [1] Slot08
diskid   HGST     HUH728080AL4204  serial             no  no  [1] Slot09
diskid   HGST     HUH728080AL4204  serial             no  no  [1] Slot10
diskid   HGST     HUH728080AL4204  serial             no  no  [1] Slot11
c2t0d0                  Kingston DataTraveler 2.0 -                    -   -   -

디스크에 오류가 발생하면 이 목록에서 제거됩니다. 이 예에서는 섀시 0 슬롯 01의 디스크에 오류가 발생합니다.

인클로저 0에는 항상 24개의 디스크 00-23이 있고 인클로저 1에는 항상 12개의 디스크 00-11이 있다고 가정할 때 어떤 디스크가 누락되었는지 효율적이고 정확하게 확인할 수 있는 방법은 무엇입니까?

현재 다음이 있지만 단일 awk 명령으로 이 작업을 수행할 수 있다고 확신합니다.

enclosure0=($(awk '$7 ~ "[0]"{print $8}' <<<"$DISK_INFO" | sort -n))
enclosure1=($(awk '$7 ~ "[1]"{print $8}' <<<"$DISK_INFO" | sort -n))
for n in {00..23}; do
  grep -q "$n" <<<"${enclosure0[@]}" || missing+=("Enclosure 0 - Slot$n")
done
for n in {00..11}; do
  grep -q "$n" <<< "${enclosure1[@]}" || missing+=("Enclosure 1 - Slot$n")
done

답변1

아니요 awk, 각 쉘에 대해 다음을 수행합니다.

{ printf '[0] Slot%s\n' {00..23} ; grep -Eo '\[0\] Slot..' disks ; } | sort | uniq -u

느린:

  • printf '[0] Slot%s\n' {00..23}가능한 모든 디스크 목록 생성
  • grep -Eo '\[0\] Slot..' disks기존 디스크 추출
  • {..}는 두 명령의 출력을 연결합니다.
  • sort | uniq -u한 번만 나타나는 행 추출

printf 및 grep 단계를 적절한 기능으로 바꾸거나 printf 부분을 다른 파일(예: 예상 디스크 목록)의 유사한 grep으로 바꿀 수 있습니다.

답변2

어떤 항목이 있어야 하는지 미리 알고 있으므로 목록을 작성하고 보이는 대로 체크 표시하세요.

awk '
    BEGIN {
        for (i = 0; i < 24; i++) missing[0][sprintf("%02d", i)] = 1;
        for (i = 0; i < 12; i++) missing[1][sprintf("%02d", i)] = 1;
    }
    $7 ~ /^\[[0-9]+\]$/ && $8 ~ /^Slot[0-9]+$/ {
        gsub(/[^0-9]/, "", $7);
        sub(/^[^0-9]+/, "", $8);
        delete missing[$7][$8];
    }
    END {
        for (enclosure in missing) {
            for (slot in missing[enclosure]) {
                printf "Missing enclosure %d Slot%s\n", enclosure, slot;
            }
        }
    }
'

답변3

perl -sle '
  my(@e, @AoA) = qw/ 24 12 /;
  $AoA[$1][$2]++ while /\[([01])]\h+(?:(?!\d)\S)+0*(\d+)$/mg;
  for my $enc ( 0 .. $#e ) {
     for my $m_slot ( grep { ! defined $AoA[$enc][$_] } 0 .. $e[$enc]-1 ) {
         print "in enclosure $enc - Slot$m_slot is missing.";
     }
  }
 ' -- -_="$DISK_INFO";

설명하다:

°  Initialize the array @e which holds the number of slots in the various enclosures. 

° The Disk info variable is passed into the command line as $_ initialized to $DISK_INFO. 

°  progressively scan and match the $_ variable using the while loop and look for the numbers in the '[..]' and the 'Slot...'  locations. Using these we update the array of array @AoA, it can be viewed as a matrix. 

°  Now once we have ingested all the data, its time to process it now in two for loops. 

° The outer for loops on the enclosures, in our case, they are two. 

° The inner for loop computes the indices of the current enclosure elements that are undefined, IOW, those slots that were never encountered during the data collection drive in the while loop. 

관련 정보