如果有人擅长编写 bash 脚本,并且倾向于执行以下操作,我希望实现这一目标:
我不擅长编写 bash,更不擅长使用 cut 或 sed,如果这可以在 bash 中用最少的行数来完成,我宁愿这样做而不是编写 C 程序
smartctl --scan
/dev/sda -d scsi # /dev/sda, SCSI device
/dev/sdb -d scsi # /dev/sdb, SCSI device
/dev/bus/0 -d megaraid,0 # /dev/bus/0 [megaraid_disk_00], SCSI device
/dev/bus/0 -d megaraid,1 # /dev/bus/0 [megaraid_disk_01], SCSI device
/dev/bus/0 -d megaraid,2 # /dev/bus/0 [megaraid_disk_02], SCSI device
/dev/bus/0 -d megaraid,3 # /dev/bus/0 [megaraid_disk_03], SCSI device
/dev/bus/0 -d megaraid,4 # /dev/bus/0 [megaraid_disk_04], SCSI device
/dev/bus/0 -d megaraid,5 # /dev/bus/0 [megaraid_disk_05], SCSI device
/dev/bus/0 -d megaraid,6 # /dev/bus/0 [megaraid_disk_06], SCSI device
/dev/bus/0 -d megaraid,7 # /dev/bus/0 [megaraid_disk_07], SCSI device
# 'sdb' not important just always used 'sda' for the following
# for m = 0 to n per the --scan output giving 0..7 do
# smartctl -a -d megaraid,m /dev/sda | grep/sed/cut XXX
# where the XXX results in just `KPM5WRUG3T84 12345678a` being extracted
# from the smartctl -a output being this:
# end for m
=== START OF INFORMATION SECTION ===
Product: KPM5WRUG3T84
User Capacity: 3,840,755,982,336 bytes [3.84 TB]
Logical block size: 512 bytes
Physical block size: 4096 bytes
LU is resource provisioned, LBPRZ=1
Rotation Rate: Solid State Device
Form Factor: 2.5 inches
Serial number: 12345678a
因此,对于我的 8 个磁盘,我希望从脚本中获取此格式化输出,以便我可以轻松地在 Excel 中打开;这是用于磁盘库存
0 KPM5WRUG3T84 12345678a
1 KPM5WRUG3T84 12345678b
2 KPM5WRUG3T84 12345678c
3 KPM5WRUG3T84 12345678d
4 KPM5WRUG3T84 12345678d
5 KPM5WRUG3T84 12345678e
6 KPM5WRUG3T84 12345678f
7 KPM5WRUG3T84 12345678g
更新:这是我根据下面斯蒂芬·基特的回答编写的 bash,谢谢。
#!/bin/bash
N=`smartctl --scan | grep megaraid | wc -l`
for (( m = 0; m < N; m++ )); do
echo "$m" $(smartctl -a -d "megaraid,$m" /dev/sda | grep -E '(^Product:|^Serial number:)' | cut -d: -f2)
# this one prints # manuf model serial
# smartctl -a -d "megaraid,$m" /dev/sda -json | jq -r "\"$m \" + .model_name + \" \" + .serial_number"
done
对于你正在做的事情,我认为尝试解析 的输出
smartctl --scan
是错误的解决方案。如果您想要所有连接的驱动器的型号和序列号列表,您可以执行以下操作:在我的系统上会产生:
已准备好导入到您最喜欢的电子表格中。如果它列出了您不感兴趣的设备,您可以使用 grep 过滤掉它们。例如:
其产生:
这将在循环中提取单个驱动器的产品名称和序列号:
这会输出序列号,提取两个相关行中的值,并将
paste
所有内容放入带有单个空格分隔符的一行中。如果您的版本
smartctl
可以生成 JSON 输出,您可能需要使用以下命令来解析它jq
:这是一个可扩展的
awk
解决方案: