失われた番号を見つけるより効率的な方法

失われた番号を見つけるより効率的な方法

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に置き換えることができます。

おすすめ記事