Hilfe bei besser auswertung von Daten in der Bash

Gast #5908875
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 7 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.