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.