用Bash剥离特定信息

时间:2019-06-19 20:43:03

标签: bash awk grep grafana influxdb

我有一个小的bash脚本,用于查看Dell服务器上的机箱温度。该脚本将在Icinga2的50台服务器上运行,并通过Influxdb将发现的结果报告给Granfana。我需要从以下输出中获取临时信息:

Temperature Probes Information

--
Probe Name                : System Board Inlet Temp
Reading                   : 21.0 C
--
Probe Name                : CPU1 Temp
Reading                   : 39.0 C

我当时正在考虑使用awk来打印值(回显不带引号的变量,awk'{print $ 14}'将以21.0为例。

问题是我有几台服务器具有2个CPUS,awk位置会有所不同

到目前为止,我要收集上述输出的代码是:

HOST=$1

dell_probes=$(ssh someUser@${HOST} "/opt/dell/srvadmin/sbin/omreport chassis temps | grep Probe -A1")

echo "$dell_probes"

我还没有尝试过任何sed / awk解决方案,只是不确定哪种解决方案最优雅。

我希望输出看起来像下面这样,以便可以与influxdb一起使用:

echo "$mb_temp"
21.0

echo "$cpu1_temp"
39.0

echo "$anyother_cpu_listed"
39.1

2 个答案:

答案 0 :(得分:1)

使用数组。我会用sed加载它。

$: temps=( $(  sed -nE '
     /^Reading / {
       s/^Reading *: *([0-9.]+).*/\1/;
       p; 
     }
   ' input ) )
$: for t in "${!temps[@]}"
> do echo "Temp for CPU $t - > ${temps[$t]}"
> done
Temp for CPU 0 - > 21.0
Temp for CPU 1 - > 39.0

答案 1 :(得分:1)

使用awk时,您永远不需要grep。这可能是您需要的:

dogs

我用$ cat tst.sh #!/bin/env bash declare -A temps="( $( #/opt/dell/srvadmin/sbin/omreport chassis temps | cat file | awk -F'[[:space:]]*:[[:space:]]*' ' f { sub(/ .*/,"",$NF); printf "[%s]=\"%s\"\n", name, $NF; f=0 } $1 == "Probe Name" { name=$2; sub(/ Temp$/,"",name); gsub(/ /,"_",name); f=1 } ' ) )" printf '%s\n' "${temps[System_Board_Inlet]}" printf '%s\n' "${temps[CPU1]}" $ ./tst.sh 21.0 39.0 代替了我注释掉的真实命令,因为这是我现在必须用作输入的全部信息。