![awk 中的正则表达式来自 txt 文件,一行](https://linux22.com/image/169276/awk%20%E4%B8%AD%E7%9A%84%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%9D%A5%E8%87%AA%20txt%20%E6%96%87%E4%BB%B6%EF%BC%8C%E4%B8%80%E8%A1%8C.png)
我目前正在编写一个擦除硬盘驱动器的脚本。第一个脚本已经开始工作,并检查是否有新的硬盘可用。如果有可用的新磁盘,它将在 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.txt
then 中是否有任何条目,用于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
......