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.