複数行の出力から一致するパターンに最も近い、上記の文字列を抽出します。

複数行の出力から一致するパターンに最も近い、上記の文字列を抽出します。

以下は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一致するディスクが出力の配列の下に最初、2番目、3番目などである可能性があるため、必ずしもそうではありません。

  • 出力に使用可能な複数のRAIDアレイ構成がある可能性があるため、アレイが存在する可能性があります。第二ちょっと待ってください。一番近いものを見つけてインポートする必要があります。」大量に「私の入力ディスクに一致する文字列

答え1

次のPerl onelinerはファイルを1行ずつ読み込み、物理ドライブ「1I:1:1」の行に遭遇するまで最後の配列を記録します。

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

関連情報