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......

相关内容