Bashファイル - コマンド出力で値を見つけて変数として保持

Bashファイル - コマンド出力で値を見つけて変数として保持

UPSに接続してバッテリ値を取得して変数に保存するスクリプトを作成しようとしています。

UPSに正常に接続して情報を取得しましたが、バッテリーの値を変数にインポートするのが困難です。

これまでのスクリプト

#!/bin/bash
# 

# Connect to ups and output values into output var
output="$( upsc ups@localhost)"

# Trip the output to just have battery charge info
output1="$( sed -n '/battery.charge:*/,/./p' <<< "$output" )"

echo "$output1";

出力を返す

ambient.1.humidity.alarm.high: 60.00
ambient.1.humidity.alarm.low: 30.00
ambient.1.temperature.alarm.high: 40.00
ambient.1.temperature.alarm.low: 10.00
battery.charge: 100.00
battery.current: 0.00
battery.current.total: 0.00
battery.date: 03/15/2013
battery.runtime: 2040.00
battery.runtime.low: 120
battery.voltage: 54.70
device.mfr: APC
device.model: Smart-UPS 2200
device.serial: IS1248007101
device.type: ups
driver.name: snmp-ups
driver.parameter.pollinterval: 2
driver.parameter.port: 172.16.27.207
driver.version: 2.7.2
driver.version.data: apcc MIB 1.2
driver.version.internal: 0.72
input.frequency: 50.00
input.sensitivity: high
input.transfer.high: 253
input.transfer.low: 208
input.transfer.reason: smallMomentarySpike
input.voltage: 249.00
input.voltage.maximum: 249.00
input.voltage.minimum: 247.50
output.current: 2.30
output.frequency: 50.00
output.voltage: 249.00
output.voltage.nominal: 230
ups.delay.shutdown: 0
ups.delay.start: 0
ups.firmware: UPS 06.5 / MCU 11.0 / UBL 08.2 / MBL 11.0 (ID18)
ups.id: UPS-Understage
ups.load: 25.30
ups.mfr: APC
ups.mfr.date: 11/24/2012
ups.model: Smart-UPS 2200
ups.serial: IS1248007101
ups.status: OL
ups.temperature: 18.30
ups.test.date: 04/12/2016
ups.test.result: Ok

バッテリーと書かれた部分だけが必要です。充電:100.00

変数として

スクリプトを通して私が得た結果は次のとおりです。

battery.charge: 100.00
battery.current: 0.00

サポートが必要な場合は、バッテリー充電ビットから100.00を入手してください。

答え1

中間変数もなく次もない1行でgrep

output="$( upsc ups@localhost | awk '/battery\.charge/ {print $2}'

答え2

あなたの質問は単一の変数を取得することにのみ関連していますが、1つのアプローチは全体の出力を環境upscに吸い込み、bashそこから必要な値を選択することです。気をつけて:

upsc_parser()
{
    local upsc_var
    local upsc_val
    while read
    do
        upsc_var="${REPLY%: *}"
        upsc_val="${REPLY#${upsc_var}: }"
        upsc_var="${upsc_var//./_}"
        upsc_val="${upsc_val//[\"\'\\]/}"
        echo "upsc_${upsc_var}=\"${upsc_val}\""
    done
}

eval $(upsc | upsc_parser)
echo $upsc_battery_charge

これにより、後で他の値が必要であると判断した場合は、余分な作業を必要とせずに必要な値を取得できます。

答え3

バッテリー充電関連の出力を変数に割り当てるだけです。

BCHRG="$( upsc ups@localhost | grep battery.charge | awk {'print $2'} )"

答え4

それほどエレガントではありませんが、必要に応じてawkを使用してスクリプトの最後の行を変更できます。

echo $output1 | grep battery.charge | awk {'print $2'}

変数として保持するには、次のようにします。

output2=$(echo $output1 | grep battery.charge | awk {'print $2'})

関連情報