Удаление конкретной информации с Bash - PullRequest
0 голосов
/ 19 июня 2019

У меня есть небольшой скрипт bash, который просматривает временные характеристики корпуса на сервере Dell. Скрипт будет работать на 50 серверах с Icinga2 и сообщать о результатах в Granfana через Influxdb. Мне нужно получить временные значения из следующего вывода:

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, просто не уверен, каким будет самый элегантный подход к этому.

Я бы хотел, чтобы вывод выглядел следующим образом, чтобы я мог использовать его с influenxdb:

echo "$mb_temp"
21.0

echo "$cpu1_temp"
39.0

echo "$anyother_cpu_listed"
39.1

Ответы [ 2 ]

1 голос
/ 20 июня 2019

Вам никогда не понадобится grep, когда вы используете awk. Это, вероятно, то, что вам нужно:

$ 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

Я использовал cat file вместо вашей настоящей команды, которую я прокомментировал, поскольку это все, что я должен использовать в качестве ввода на данный момент.

1 голос
/ 20 июня 2019

Использовать массив. Я бы загрузил его с 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
...