2

我正在尝试从 smartctl 命令获取特定数据。我想获得总的 power_on_hours,但我不想要所有的填充物。我只想要直接的时间。这是我现在想出的命令:

smartctl -A /dev/sda | grep Power_On_Hours

我的输出类似于:

9 Power_On_Hours          0x0032   100   100   000    Old_age   Always       -       27

我想要最后一个号码。我认为我可能会以某种方式读取到文件末尾并倒数到第一个空格或搜索到连字符并读取到文件末尾。我只是不知道我会怎么做。我对 grep 的经验太低了,不知道如何解决这个问题。我的目标是让输出类似于:

27

任何帮助将非常感激。

4

4 回答 4

3

如果您可以/想要使用awk它很容易使用awk '{print $NF}'. 例如,建立在您已有的基础上:

smartctl -A /dev/sda | grep Power_On_Hours | awk '{print $NF}'

NF是字段数的 awk 内置变量。使用$NF方法来使用该字段的内容。

但是grep,您可以通过awk搜索字符串来缩短(并消除):

 smartctl -A /dev/sda | awk '/Power_On_Hours/ {print $NF}'
于 2012-08-14T19:15:38.830 回答
1

您可以使用

两个grep管道

smartctl -A /dev/sda | grep Power_On_Hours | grep -o '[0-9]+$'

第二个grep将仅打印匹配的部分。有时,需要三个或更多greps 来隔离您要查找的内容。我将其用于快速而肮脏的工作。

于 2012-08-14T19:17:56.777 回答
1

FWIW,这是一个 zsh 函数,它使用 sed(1) 从 smartctl 输出中检索命名属性:

function get_smart_attrib() {
    local attrib="$1"
    local disk="$2"
    smartctl --attributes -f brief "$disk" \
        | sed -rn "/ $attrib /"'s/.{61}//p'
}

只有声明本身是 zsh 特定的,函数体应该在大多数类似 bourne 的 shell 中工作。

也可以在纯 shell 中使用 while 读取循环来执行此操作,大致如下(未经测试)($myattr 设置为我们要查找的属性的名称):

smartctl -A -f brief /dev/sda | while read foo attrname foo foo foo foo foo value; do
    [[ "$attrname" = "$myattr" ]] && echo $value && break
done
于 2014-02-25T21:13:01.857 回答
0

awk显然是正确的工具,但您也可以这样做:

smartctl -A /dev/sda | grep Power_On_Hours | tr -s \  \\t | cut -f 10

(注意反斜杠之间的 2 个空格,或者您可能更喜欢tr -s ' ' '\t')从文本中选择特定列的两个最常用的工具是cutawk,您应该熟悉这两个工具。 cut对空白比 更挑剔awk,并且tr上述管道中的目的是清理空白cutawk很好,因为您可以将最后一列引用为$NF,但cut您需要计算。

于 2012-08-14T21:39:08.093 回答