从hdparm输出中提取信息

时间:2018-05-15 14:09:08

标签: linux bash awk grep

如果您运行hdparm -I /dev/X其中X是您的SSD设备,它将打印信息(只读操作)类似于此

...
Security: 
    Master password revision code = 36401
        supported
    not enabled
        locked
    not frozen
        expired: security count
        supported: enhanced erase
...

因此,使用

not前面提取frozen应该很容易
for d in $(ls /sys/block); do
    is_frozen=$(hdparm -I /dev/$d | awk '/frozen/ { print $1 }')
    echo $is_frozen
done

然而,它始终会返回frozen,就像not不在那里一样。

问题

有人可以解释如何从not行中提取frozen吗?

2 个答案:

答案 0 :(得分:1)

一个可能的原因可能是你在屏幕上看到的不是awk的结果,而是stderr的结果。以下是诊断它的方法:

  1. 暂时放弃for循环并使用一台设备进行测试,比如说sda。
  2. 将输出重定向到文件,例如$ sudo hdparm -I / dev / sda> / tmp / tempfile
  3. 看看你是否仍然看到“冻结”没有屏幕的行。

答案 1 :(得分:1)

在我的系统上,/ dev / sda目前已被冻结,而/ dev / sdb未被冻结,如下所示:

# hdparm -I /dev/sda | grep frozen
        frozen
# hdparm -I /dev/sdb | grep frozen
    not    frozen

只需将$d添加到echo命令中即可查看设备及其正确的相应值(我冒昧用更短的{{1}替换冗长的awk命令}):

grep

如果您想要清理输出,请将# for d in $(ls /sys/block) ; do is_frozen=$(hdparm -I /dev/$d | grep frozen) ; echo $d $is_frozen ; done HDIO_DRIVE_CMD(identify) failed: Invalid argument loop0 ... sda frozen sdb not frozen 替换为ls

find

或者# for d in $(find /sys/block -name 'sd*' -exec basename {} \;) ; do is_frozen=$(hdparm -I /dev/$d | grep frozen) ; echo $d $is_frozen ; done sda frozen sdb not frozen 代替ls

/dev/sd?