使用grep来解析数据

时间:2012-08-14 19:12:27

标签: linux awk grep

我正在尝试从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 个答案:

答案 0 :(得分: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}'

答案 1 :(得分:1)

您可以使用

两个grep s piped

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

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

答案 2 :(得分: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

答案 3 :(得分:0)

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

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

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