Forum: PC-Programmierung Hilfe bei besser auswertung von Daten in der Bash


von test (Gast)


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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

1
sed -ne 's/.*capacity.* \([0-9.][0-9.]*\)%.*/\1/p'

von DPA (Gast)


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]'

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.)

von DPA (Gast)


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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

DPA schrieb:
> Die variablen werden nicht in der do-while schleife exportiert.
> Stattdessen wird dieses ausgegeben, und dann als string an eval
> übergeben.

Ah ok. Das war zu obfuscated, um es sofort zu begreifen. :-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.