CUT des Zeichens "°" im Script will nicht mehr.

brenner

Commander
Registriert
Apr. 2002
Beiträge
3.030
Moin,

ich transferiere gerade meinen alten Scripte von einem
Linux 3.18.11-v7+ #781 SMP PREEMPT Tue Apr 21 18:07:59 BST 2015 armv7l GNU/Linux
zu
Linux SRV-RPI-006 5.15.32-v8+ #1538 SMP PREEMPT Thu Mar 31 19:40:39 BST 2022 aarch64 GNU/Linux
um.

Alles soweit ok, aber ich schaffe es partout nicht mehr das ° Zeichen als Delimiter zum laufen zu bekommen. Hab schon alle möglichen Schreibweisen probiert :-( Andere Trenner wir zB "%" funktionieren weiterhin wunderbar.


root@SRV-RPI-006:~# /usr/src/siloader/siloader -s | head -n 11 | tail -n 1 | tr -d "TA: "
0.0ºCKesselstatusus
root@SRV-RPI-006:~# /usr/src/siloader/siloader -s | head -n 11 | tail -n 1 | tr -d "TA: " | cut -d "°" -f 1
cut: the delimiter must be a single character
Try 'cut --help' for more information.
root@SRV-RPI-006:~#
 
° ist in UTF-8 ein Multibyte Zeichen - konkret 0xc2b0. ° in ISO-8859-15 ist 0xb0. Du musst also die entsprechende Escape-Sequenz für das entsprechende Encoding verwenden. Natürlich nur wenn der Input entsprechend vorliegt. Sonst musst du iconv zum Konvertieren verwenden.

Du kommst ergo mit nem
Code:
/usr/src/siloader/siloader -s | head -n 11 | tail -n 1 | tr -d "TA: " | cut -d "$(echo -e "\xb0")" -f 1
ans Ziel.
 
  • Gefällt mir
Reaktionen: GTrash81, PHuV und abcddcba
Danke für deine Rückmeldung.

Leider erfolglos

root@SRV-RPI-006:~# /usr/src/siloader/siloader -s | head -n 11 | tail -n 1 | tr -d "TA: " | cut -d "$(echo -e "\xb0")" -f 1
0.0ºCKesselstatusus
root@SRV-RPI-006:~#
 
cut sieht das Zeichen als Multibyte

Code:
printf '°' | hexdump -C
00000000  c2 b0                                             |..|
00000002

EDIT: zu langsam
 
Achso, so sieht die ungeschnittene Ausgabe aus:

root@SRV-RPI-006:~# /usr/src/siloader/siloader -s
----------------------------------------------------------------
SystaInterface Status & Info

SystaComfort or SystaCompact and SystaSolar
----------------------------------------------------------------

Date - Time : 28.04.2022 - 20:47

Info
----
TA: 0.0 ºC Kesselstatus: Aus
TK: 0.0 ºC Kesselstarts: 20530
PK: 0 % Kessellaufzeit: 17821 h

Puffer Heizkreis 1 Heizkreis 2
------ ----------- -----------
TWO: 73.0 ºC TI1: 24.7 ºC TI2: 0.0 ºC
TPO: 65.7 ºC TV1: 64.4 ºC TV2: -29.6 ºC
TPU: 62.6 ºC TR1: 61.6 ºC TR2: -29.1 ºC
TWU: 39.1 ºC TV1S: 65.0 ºC TV2S: 0.0 ºC
TWOS: 63.0 ºC RT1S: 24.5 ºC RT2S: 0.0 ºC
TPOS: 65.0 ºC PHK1: 65 % PHK2: 0 %

Solar Störung
----- -------
TSA: 23.3 ºC Kessel : --
TSE: 27.8 ºC Fühler : 10
PSO: 0 % Solar : --
Status: Aus (0)
Leistung: 0.0 kw
Tagesgewinn: 24 kwh
Ertrag: 437 kwh

root@SRV-RPI-006:~#
Ergänzung ()

abcddcba schrieb:
cut sieht das Zeichen als Multibyte

Code:
printf '°' | hexdump -C
00000000  c2 b0                                             |..|
00000002

EDIT: zu langsam

Aber warum hat bzw. funktioniert es denn auf dem alten System? War CUT da noch anders?
Ergänzung ()

Yuuri schrieb:
° ist in UTF-8 ein Multibyte Zeichen - konkret 0xc2b0. ° in ISO-8859-15 ist 0xb0. Du musst also die entsprechende Escape-Sequenz für das entsprechende Encoding verwenden. Natürlich nur wenn der Input entsprechend vorliegt. Sonst musst du iconv zum Konvertieren verwenden.

Du kommst ergo mit nem
Code:
/usr/src/siloader/siloader -s | head -n 11 | tail -n 1 | tr -d "TA: " | cut -d "$(echo -e "\xb0")" -f 1
ans Ziel.


Habe mal ein bißchen rumgespielt, das scheint geholfen zu haben

root@SRV-RPI-006:~# /usr/src/siloader/siloader -s | head -n 11 | tail -n 1 | tr -d "TA: " | cut -d "$(echo -e "\xc2")" -f 1
0.0
root@SRV-RPI-006:~#

Ist das so ok?
 
Zuletzt bearbeitet:
Darf ich bitte mal blöde fragen, was Du da genau machst? In meinen Augen ist das Ding viel zu kompliziert aufgebaut, das geht bestimmt einfacher. Zudem löst Du mit jedem | einen weiteren Fork als Subprozess aus, was enorm die Performance drückt. Das dürfte für eine genaue Abfrage bei Dir nicht wesentlich sein, aber bei größeren Dateien macht sich das schnell bemerkbar. Die Bash bietet eine Menge Inline-Funktionen, keine weitere Befehle mehr benötigt werden.

Wenn Du Lust hast, zeigt mal bitte genau, was Du machst bzw. machen willst, und dann kann man das bestimmt noch vereinfachen bzw. optimieren.

Update:
Ist das hier Deine Datei, die Du ausliest?
https://forum.iobroker.net/topic/53489/bash-shell-script-mit-iobroker-ersetzen-sinnvoll/5
Ergänzung ()

brenner schrieb:
Aber warum hat bzw. funktioniert es denn auf dem alten System? War CUT da noch anders?
Was ist bei Dir als Sprache bzw. Zeichensatz eingestellt? Hattest Du vorher im Linux ein ISO-88591-15 eingestellt, und nun ein UTF8?

Code:
ubuntu@user:~$ set|grep LANG
LANG=C.UTF-8
Mit file - i <Datei> kannst Du prüfen, wie beispielsweise Deine Datei vorliegt. Lenke mal die Ausgabe von siloader um in eine Datei und prüfe sie auf dem alten wie den neuen System.

Code:
ubuntu@user:~$ /usr/src/siloader/siloader -s > meinedatei.txt
ubuntu@user:~$ file -i meinedatei.txt
meinedatei.txt: text/plain; charset=utf-8
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: GTrash81
@PHuV

Korrekt, ist mein Beitrag, habe aber an der Stelle bereits aufgegeben.

Bin gerade ins Bett und Notebook liegt unten, daher in kurz.

Auf meiner Homematic CCU sind für jeden einzelnen Wert Variablen angegeben, zB. die Systemvariable „HZ_TA“ (Heizung Temperatur Aussen). Auf der CCU ist zudem das Plugin „xmlapi“ installiert was mir ermöglicht per wget die Systemvariablen von aussen zu befüllen.

Auf einem Raspberry Pi läuft ein Script, das mittels „siloader -s“ die oben gezeigten Werte ausspuckt. An dem Pi hängt ein Stück Hardware welches die Heizungsanlage ausliest.
Mit meinem Script schneide ich mir die gewünschten Werte raus (fast alle) und übertrage sie per wget zur CCU. Das Script wird über crontab jede Minute ausgeführt und hat eine Laufzeit von ein paar Sekunden.

Da die CCU an den iobroker angebunden ist bekomme ich über diesen Weg die Daten weiter über influxDB und Grafana visualisiert. Ich brauche die Heizungsdaten auch in der CCU zum auswerten und schalten.

Ja, mein komisches Script geht ganz sicher, aber das ist das was ich mir vor Jahren so zusammengebastelt habe und auch lief bis ich den Pi erneuert habe.
 
Ok, dann prüfte das das mal wie oben angegeben mit file. Ich würde vermuten, daß auf beiden Systemen unterschiedliche Zeichensätze eingestellt sind.
 
Guten Morgen,

beim Altsystem:
LANG=de_DE.UTF-8

beim Neuen war irgendwas anderes noch drin. Jetzt steht hier auch:
LANG=de_DE.UTF-8


Mein altes Script mit dem "°" funktioniert aber weiterhin nicht, was aber ja auch egal ist aufgrund der neuen funktionierenden Schreibweise. Das mit dem "file - i" geht leider nicht, der Befehl wird nicht gefunden.
 
Zurück
Oben