awk 中的正規表示式來自 txt 文件,一行

awk 中的正規表示式來自 txt 文件,一行

我目前正在編寫一個擦除硬碟的腳本。第一個腳本已經開始工作,並檢查是否有新的硬碟可用。如果有可用的新磁碟,它將在 a 中列出statuslist.txt並使用areca_cli disk create drv=X將其設為Pass Through

所有statuslist.txt新磁碟均按插槽號碼和型號類型儲存。不幸的是,所有條目都列在一行中,而不是每行列出一個條目。我認為這使得與 的進一步合作變得更加複雜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

這是擦除硬碟中列出的第二個腳本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)

(這也修復了「slot」拼字錯誤,大小寫很重要)。

我不確定你如何在後續循環中嘗試使用它,你不會sdx隨著改變而改變x...

相關內容