Hilfe bei besser auswertung von Daten in der Bash

Gast #5908875
Lesenswert?

Hallo,
wie kann ich folgende Datei besser auswerten? vorallem so das es immer 
funktioniert egal bei welchem Wert? ich möchte immer die ganze zahl ohne 
die Einheit haben. das Problem ist wenn bei der Battery capacity: 
100.00%  angeziegt wird bekomme ich nur 100. und bei 0.00 bekomme 0.00 
ich will aber jedesmal die komplette zahl mit nachkommezahl haben.....
1
********************************
2
*                              *
3
* Powering Source: Primary     *
4
* Charging circuit: OFFLINE    *
5
* Charging current: 300 mA     *
6
*                              *
7
* Voltage in: 5.27 V           *
8
* Battery capacity: 100.00%    *
9
* Battery voltage: 4.20V       *
10
* Power Battery: 000.00 mA     *
11
* Power Extern: 1345.00 mA      *
12
*                              *
13
* Shutdown timer: 40           *
14
* Autostart:  enabled          *
15
* Sleep timer: 10               *
16
*                              *
17
********************************

hier ist mein code
1
 var string_localsusvpowerextern =  grep 'Power Extern' /etc/openhab2/services/susv.status | cut -d' ' -f4
2
        var string_localsusvpowerbattery =  grep 'Power Battery' /etc/openhab2/services/susv.status | cut -d' ' -f4
3
        var string_localsusvbatterycapacity =  grep 'Battery capacity:' /etc/openhab2/services/susv.status | cut -d' ' -f4 | cut -c -4
4
        var string_localsusvbatteryvoltage =  grep 'Battery voltage' /etc/openhab2/services/susv.status | cut -d' ' -f4 | cut -c -4
5
        var string_localsusvvoltagein =  grep 'Voltage in' /etc/openhab2/services/susv.status | cut -d' ' -f4
6
        var string_localsusvchargingcurrent =  grep 'Charging current' /etc/openhab2/services/susv.status | cut -d' ' -f4
7
        var string_localsusvchargingcircuit =  grep 'Charging circuit' /etc/openhab2/services/susv.status | cut -d' ' -f4
Gast #5909128
Lesenswert?

1
eval "$(grep -o "^\* [^:*]*:[^*]* \*$" ./file_with_data | sed 's/^\* *//;s/ *\*$//;s/^\([^:]*\): */\U\1=/' | while IFS='=' read k v; do echo "export $(printf '%s' "$k" | sed '
2
s/[^a-zA-Z0-9]/_/g')='$v'"; done)"
3

4
printf '%s' "$BATTERY_CAPACITY" | grep -o '^[0-9]*\.[0-9]'
Moderator Persönliche Seite #5909137
Lesenswert?

Generisch, aber reichlich komplex. Außerdem, wenn man schon den sed an 
Bord hat, kann man sich grep sparen - das macht sed problemlos gleich 
mit.

Kritisch daran: do ... done Schleifen laufen in den meisten Shells in 
einer Subshell, daraus funktioniert das Exportieren einer 
Environment-Variablen dann nicht. Bash ist da eher die Ausnahme. (Ja, 
hier war explizit nach dieser gefragt. Nur, falls das mal jemand über 
die Suchfunktion findet und nachnutzen möchte.)
Gast #5909159
Lesenswert?

Jörg W. schrieb:
> Kritisch daran: do ... done Schleifen laufen in den meisten Shells in
> einer Subshell, daraus funktioniert das Exportieren einer
> Environment-Variablen dann nicht. Bash ist da eher die Ausnahme. (Ja,
> hier war explizit nach dieser gefragt. Nur, falls das mal jemand über
> die Suchfunktion findet und nachnutzen möchte.)

Das Beispiel oben ist voll POSIX Shell compliant. Die variablen werden 
nicht in der do-while schleife exportiert. Stattdessen wird dieses 
ausgegeben, und dann als string an eval übergeben. eval führt dieses 
export dann in der momentanen schell aus.

Mein script hat aber ein anderes Problem. Im Wert der Variablen werden 
vor der Ausgabe die ' nicht Escaped, was eine Sicherheitslücke 
darstellt:
1
* x: '; echo "I\'m in!!!"; echo ' *

Auf die schnelle ist mir aber gerade keine gute Alternative zu eval 
eingefallen. Ich hatte erst gehofft, ich könnte export nehmen, aber das 
hat die Abstände nicht wie erhofft gesplittet.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren