txt ファイルから awk 内で 1 行の正規表現を実行する

txt ファイルから awk 内で 1 行の正規表現を実行する

現在、ハード ドライブを消去するスクリプトを作成中です。最初のスクリプトはすでに動作しており、新しいハード ドライブが使用可能かどうかを確認します。新しいディスクが使用可能であれば、それを にリストしstatuslist.txt、 を使用しareca_cli disk create drv=Xて に設定しますPass Through

すべてのstatuslist.txt新しいディスクは、スロット番号とモデル タイプ別に格納されます。残念ながら、各エントリが 1 行にリストされるのではなく、すべてのエントリが 1 行にリストされます。これにより、 での今後の作業が複雑になると思いますstatuslist.txt

エントリー: Slot#1 ST3500413AS Slot#2 SEAGATE ST32000444SS Slot#3 INTEL SSDSC2BA100G3 Slot#6 ST320LT007-9ZV142 Slot#8 SEAGATE ST32000444SS

そのために、statuslist.txt次のコマンドを使用します。

slist=$(areca_cli disk info | awk -F "   *" '{if ($5 != "N.A." && $7 == "Free") print($4" "$5); }')
echo $slist >> /home/user/statuslist.txt

これは、 にリストされているハード ドライブを消去する 2 番目のスクリプトですstatuslist.txt

if ステートメントは、statuslist.txtthen を使用してエントリが存在するかどうかを確認しdd、それらを消去します。

sdx=$(lsscsi | awk '{if ($5 == "R001" && $5 != "-" ) print $NF}' | awk '{ print $0}')
x=$(cat /home/user/statuslist.txt | awk '{if ( $1 ~/slot#*/)print $1}')

if [ ${#wipe[@]} -gt 0 ]; then
        for i in $x; do dd if=/dev/zero of=$sdx bs=10M status=progress; done
        echo "Following hard drives are getting wiped:" $x
else
        echo "dd didn't work"
fi

このスクリプトに対する私の期待は、ddのハード ドライブでのみ使用されることですstatuslist.txt。このリストの目的は、すでに消去されたハード ドライブの再消去を回避することです。消去されたハード ドライブのエントリは、テキスト ファイルから削除されます。

問題は、この変数の正規表現です。 x=$(cat /home/user/statuslist.txt | awk '{if ( $0 ~/slot#*/) print $1}')

出力が得られません。

答え1

フィールドをループする必要があります:

x=$(awk '{ for (i = 1; i < NF; i++) { if ($i ~ /^Slot#/) { print $(i + 1) } } }' /home/user/statuslist.txt)

(これにより、「スロット」のタイプミスも修正されます。大文字と小文字は区別されます)。

後続のループでそれをどのように使用しようとしているのかわかりませんが、sdx変更しても変更されませんx...

関連情報