Brauche Hilfe in einem Script

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Benutzeravatar
treki
Beiträge: 56
Registriert: 25.10.2014 22:48:40

Brauche Hilfe in einem Script

Beitrag von treki » 02.08.2019 04:42:03

Mein Script (ein Teil davon):

Code: Alles auswählen

te=`cat /home/pi/r-log |grep '"id": 7,' -a --text -C 3|tail -n3|awk '{ print $2; }'|sed 's/,//g'`  #Pearl Sender ändert Id  (hier 7) nach Batteriewechsel! Muss dann hier angepasst werden!!!
TEMP=`echo $te |awk '{print $1}'`
HUM=`echo $te |awk '{print $2}'`
BAT=`echo $te |awk '{print $3}'`
Es klappt, solange die id: 7 ist.
Habe nun feststellen müssen, dass der Aussenfühler, welcher in r-log schreibt, nach einem Batteriewechsel die id ändert.
Der Log sieht unter Anderem so aus:

Code: Alles auswählen

{
	"message": {
		"id": 29,
		"temperature": 21.7,
		"humidity": 19.0,
		"battery": 1
	},
	"origin": "receiver",
	"protocol": "alecto_ws1700",
	"uuid": "0000-00-00-10-203518",
	"repeats": 1
}
Hier sieht man, dass die id nun 29 ist. Würde gerne die uuid nehmen. Weiss nur nicht, wie ich das am besten zustande kriege.
Ich steh auf dem Schlauch, weil die uuid nachfolgend steht und nicht davor.
Das Ganze ist sonst hier noch ausführlicher dokumentiert: http://www.ltspiceusers.ch/showthread.php?t=350
Zefram Cochrane, 5. April 2063. Cochrane unternimmt den ersten Warpflug der Menschheit, was den Besuch der Vulkanier zurfolge hat (Star Trek 8 - Der Erste Kontakt)

inne
Beiträge: 3281
Registriert: 29.06.2013 17:32:10
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Brauche Hilfe in einem Script

Beitrag von inne » 02.08.2019 05:52:44

Schau dir mal die Tools Debiangron oder Debianjshon an. Oder nimm https://www.w3schools.com/python/python_json.asp

Benutzeravatar
treki
Beiträge: 56
Registriert: 25.10.2014 22:48:40

Re: Brauche Hilfe in einem Script

Beitrag von treki » 02.08.2019 06:02:28

Kann denn das ein normales Script nicht?
Ich meine, ohne zusätzliche Plugins.
Einfach die 6-8 Zeilen vorher anschauen.
Etwas wie tail -n-8
Danke erstmal für Deine Hilfe. Aber werde noch andere Antworten abwarten. Es muss doch iwie möglich sein, das per ganz normalem Script zu lösen.
Zefram Cochrane, 5. April 2063. Cochrane unternimmt den ersten Warpflug der Menschheit, was den Besuch der Vulkanier zurfolge hat (Star Trek 8 - Der Erste Kontakt)

inne
Beiträge: 3281
Registriert: 29.06.2013 17:32:10
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Brauche Hilfe in einem Script

Beitrag von inne » 02.08.2019 06:10:56

Der Input oben ist JSON und das würde ich mit entsprechenden Mitteln weiterverarbeiten. Mit Pyhon geht es recht simpel:

Code: Alles auswählen

#!/usr/bin/env python3
import json
import sys

json_input = json.loads(sys.stdin.read())

print(json_input["uuid"]) 
print(json_input["message"]["temperature"])

Benutzeravatar
treki
Beiträge: 56
Registriert: 25.10.2014 22:48:40

Re: Brauche Hilfe in einem Script

Beitrag von treki » 02.08.2019 06:16:20

Schau mal mein "altes" Projekt an. Ist bereits eine Mischung aus Python und Bash.
Arbeite gerade an einem neuen opensource Aussensensor. http://www.ltspiceusers.ch/showthread.php?t=392
Für das alte System möchte ich nicht mehr alles umdrehen ^^
Meine Posts sollten aber laufen. Ist Ehrgeiz ^^

Aber werde Dein Python genauer anschauen. Ist immer lehrreich.

Oder kann ich das iwie in das Script integrieren? Wenn ja, wie?
Zefram Cochrane, 5. April 2063. Cochrane unternimmt den ersten Warpflug der Menschheit, was den Besuch der Vulkanier zurfolge hat (Star Trek 8 - Der Erste Kontakt)

inne
Beiträge: 3281
Registriert: 29.06.2013 17:32:10
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Brauche Hilfe in einem Script

Beitrag von inne » 02.08.2019 06:22:18

Wenn Du es wie eingangs lösen willst und die uuid statt id nehmen, dann schau bei grep die Schalter -C und -A an!

cat /home/pi/r-log | grep '"uuid": "0000-00-00-10-203518",' -C 9 -A 2

:?:

Benutzeravatar
treki
Beiträge: 56
Registriert: 25.10.2014 22:48:40

Re: Brauche Hilfe in einem Script

Beitrag von treki » 02.08.2019 06:32:14

Sorry. Vergiss diese Antwort!
Zuletzt geändert von treki am 02.08.2019 06:47:02, insgesamt 1-mal geändert.
Zefram Cochrane, 5. April 2063. Cochrane unternimmt den ersten Warpflug der Menschheit, was den Besuch der Vulkanier zurfolge hat (Star Trek 8 - Der Erste Kontakt)

Benutzeravatar
treki
Beiträge: 56
Registriert: 25.10.2014 22:48:40

Re: Brauche Hilfe in einem Script

Beitrag von treki » 02.08.2019 06:44:49

Muss auf

Code: Alles auswählen

{
	"message": {
		"id": 29,
		"temperature": 21.9,
		"humidity": 19.0,
		"battery": 1
	},
	"origin": "receiver",
	"protocol": "alecto_ws1700",
	"uuid": "0000-00-00-10-203518",
	"repeats": 2
}
"alecto_ws1700" achten. Nicht uuid. Sorry!!!
Zefram Cochrane, 5. April 2063. Cochrane unternimmt den ersten Warpflug der Menschheit, was den Besuch der Vulkanier zurfolge hat (Star Trek 8 - Der Erste Kontakt)

inne
Beiträge: 3281
Registriert: 29.06.2013 17:32:10
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Brauche Hilfe in einem Script

Beitrag von inne » 02.08.2019 06:46:45

treki hat geschrieben: ↑ zum Beitrag ↑
02.08.2019 06:32:14
Kriege Syntax Error: EOF in backquote substitution in beiden Fällen
Da fehlt ein schließendes ` in der Ersetzung!

inne
Beiträge: 3281
Registriert: 29.06.2013 17:32:10
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Brauche Hilfe in einem Script

Beitrag von inne » 02.08.2019 06:50:12

treki hat geschrieben: ↑ zum Beitrag ↑
02.08.2019 06:44:49
Muss auf

Code: Alles auswählen

{
	"message": {
		"id": 29,
		"temperature": 21.9,
		"humidity": 19.0,
		"battery": 1
	},
	"origin": "receiver",
	"protocol": "alecto_ws1700",
	"uuid": "0000-00-00-10-203518",
	"repeats": 2
}
"alecto_ws1700" achten. Nicht uuid. Sorry!!!
Du solltest den Pattern und die Werte für -C und -A für grep usw. nun selbst angeben können:

te="$(grep 'PATTERN' -a --text -C ZEILEN DAVOR -A ZEILEN DANACH path/to/log)"

:?:
Zuletzt geändert von Anonymous am 02.08.2019 06:52:10, insgesamt 2-mal geändert.

Benutzeravatar
treki
Beiträge: 56
Registriert: 25.10.2014 22:48:40

Re: Brauche Hilfe in einem Script

Beitrag von treki » 02.08.2019 06:50:26

Code: Alles auswählen

#!/bin/sh
te=`cat /home/pi/test-log | grep '"protocol": "alecto_ws1700",' -a --text -C 9|tail -n2
Text file busy
...sorry. unsere Antworten überkreuzen sich gerade
Zefram Cochrane, 5. April 2063. Cochrane unternimmt den ersten Warpflug der Menschheit, was den Besuch der Vulkanier zurfolge hat (Star Trek 8 - Der Erste Kontakt)

inne
Beiträge: 3281
Registriert: 29.06.2013 17:32:10
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Brauche Hilfe in einem Script

Beitrag von inne » 02.08.2019 06:54:03

Da fehlt immer noch das schließende ` am Ende der Ersetzung!

Benutzeravatar
treki
Beiträge: 56
Registriert: 25.10.2014 22:48:40

Re: Brauche Hilfe in einem Script

Beitrag von treki » 02.08.2019 06:55:21

Ja sorry, steh total auf dem Schlauch :(
te=`cat /home/pi/test-log | grep '"protocol": "alecto_ws1700",' -a --text -C 9 -A 2
EOF Fehler.
Wo fehlt ein ' ?
Printscreen einfügen geht hier nicht :(
Mein Editor (xed) zeigt farblich alles richtig an.
Printscreen:
https://www.xup.in/dl,20502233/Auswahl_010.png/
Zuletzt geändert von treki am 02.08.2019 07:00:04, insgesamt 1-mal geändert.
Zefram Cochrane, 5. April 2063. Cochrane unternimmt den ersten Warpflug der Menschheit, was den Besuch der Vulkanier zurfolge hat (Star Trek 8 - Der Erste Kontakt)

inne
Beiträge: 3281
Registriert: 29.06.2013 17:32:10
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Brauche Hilfe in einem Script

Beitrag von inne » 02.08.2019 07:00:03

Na:

Code: Alles auswählen

te=`cat /home/pi/test-log | grep '"protocol": "alecto_ws1700",' -a --text -C 9|tail -n2`
Das geht var=`command` oder neuere Syntax var=$(command).

Benutzeravatar
treki
Beiträge: 56
Registriert: 25.10.2014 22:48:40

Re: Brauche Hilfe in einem Script

Beitrag von treki » 02.08.2019 07:01:47

Sorry. Bin zu blöd.
Habe oben noch korrigiert (xup Printscreen)

...Wie sähe meine Zeile aus nun?
Zefram Cochrane, 5. April 2063. Cochrane unternimmt den ersten Warpflug der Menschheit, was den Besuch der Vulkanier zurfolge hat (Star Trek 8 - Der Erste Kontakt)

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: Brauche Hilfe in einem Script

Beitrag von eggy » 02.08.2019 07:03:44

Versuch das mal:

Code: Alles auswählen

read  ID HUM TEMP BAT  < <(awk -F [:,] '/"id":/{ID=$2} /"humidity":/{HUM=$2} /"battery":/{BAT=$2} /"temperature":/{TEMP=$2} /"uuid": "0000-00-00-10-203518"/{print ID HUM TEMP BAT}' /home/pi/test-log  )
Nur hingemurkst, sind wahrscheinlich noch Fehler drin, obs geht müsste man mal am vollständigen Log versuchen

Idee (und Voraussetzungen):
awk nutzt hier Doppelpunkt und Komma als Trennzeichen, kommen die in Deinen Daten vor muss man sich das nochmal anders überlegen
awk merkt sich jedes Auftreten von humidity battery temparature und id, und sobald es die richtige uuid sah gibt es die zuvor gelesenen Werte aus. Sind die nicht in der richtigen Reihenfolge, kommen erst hinterher, oder tauchen garnicht auf, gehts schief
bash splittet dann die awk Ausgabe in Variablen auf - geht so evtl nur mit der bash, andere shells könnten das anders machen

Benutzeravatar
treki
Beiträge: 56
Registriert: 25.10.2014 22:48:40

Re: Brauche Hilfe in einem Script

Beitrag von treki » 02.08.2019 07:07:04

Jetzt wieder uuid? Die ist ja überall gleich.
Nicht eher:
read ID HUM TEMP BAT < <(awk -F [:,] '/"id":/{ID=$2} /"humidity":/{HUM=$2} /"battery":/{BAT=$2} /"temperature":/{TEMP=$2} /"protocol": "alecto_ws1700"/{print ID HUM TEMP BAT}' /home/pi/test-log )

Aber was stimmt am vorherigen System nicht?
Zefram Cochrane, 5. April 2063. Cochrane unternimmt den ersten Warpflug der Menschheit, was den Besuch der Vulkanier zurfolge hat (Star Trek 8 - Der Erste Kontakt)

Benutzeravatar
treki
Beiträge: 56
Registriert: 25.10.2014 22:48:40

Re: Brauche Hilfe in einem Script

Beitrag von treki » 02.08.2019 07:10:00

te=read ID HUM TEMP BAT < <(awk -F [:,] '/"id":/{ID=$2} /"humidity":/{HUM=$2} /"battery":/{BAT=$2} /"temperature":/{TEMP=$2} /"protocol": "alecto_ws1700"/{print ID HUM TEMP BAT}' /home/pi/test-log )
Syntax error: redirection unexpected
Bin sicher, es liegt an mir. Aber ich schnalle gerade nix mehr :(
Zuletzt geändert von treki am 02.08.2019 07:10:51, insgesamt 1-mal geändert.
Zefram Cochrane, 5. April 2063. Cochrane unternimmt den ersten Warpflug der Menschheit, was den Besuch der Vulkanier zurfolge hat (Star Trek 8 - Der Erste Kontakt)

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: Brauche Hilfe in einem Script

Beitrag von eggy » 02.08.2019 07:10:47

ohne te=

Benutzeravatar
treki
Beiträge: 56
Registriert: 25.10.2014 22:48:40

Re: Brauche Hilfe in einem Script

Beitrag von treki » 02.08.2019 07:11:53

Gleicher Fehler
Aber das System oben. Lass uns da weiterfahren.
Iwo fehlt ein '
Zefram Cochrane, 5. April 2063. Cochrane unternimmt den ersten Warpflug der Menschheit, was den Besuch der Vulkanier zurfolge hat (Star Trek 8 - Der Erste Kontakt)

Benutzeravatar
treki
Beiträge: 56
Registriert: 25.10.2014 22:48:40

Re: Brauche Hilfe in einem Script

Beitrag von treki » 02.08.2019 07:15:59

te=`cat /home/pi/test-log | grep '"protocol": "alecto_ws1700",' -a --text -C 9 -A 2
Gibt Fehler:
test.sh: 12: test.sh: Syntax error: EOF in backquote substitution
Aber wo fehlt das scheiss '
Zefram Cochrane, 5. April 2063. Cochrane unternimmt den ersten Warpflug der Menschheit, was den Besuch der Vulkanier zurfolge hat (Star Trek 8 - Der Erste Kontakt)

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: Brauche Hilfe in einem Script

Beitrag von eggy » 02.08.2019 07:25:53

Versuch das awk auf der Shell, nicht im Script, genau so wie ich es gespostet hab. Dann testen obs geklappt hat, mit "echo $BAT" etc.
Ich hatte das Script auf die Infors im ersten Post bezogen, dass Dir da nen Fehler unterlaufen ist, hab ich in der Vielzahl der Posts überlesem. Viel zu früh :mrgreen: egal, das Konzept sollte klar sein, das zu ändern kriegst Du auch alleine hin.
Und wenns auf der Shell tut, aber nicht im Script liegts fast immer an falsch gequotetem.

Benutzeravatar
treki
Beiträge: 56
Registriert: 25.10.2014 22:48:40

Re: Brauche Hilfe in einem Script

Beitrag von treki » 02.08.2019 07:29:36

Code: Alles auswählen

pi@DachrollosRaspi:~ $ cat /home/pi/test-log | grep '"protocol": "alecto_ws1700",' -a --text -C 9|tail -n2
		"state": "up"
	},
LOL. Wo kommt das "state": "up" her?

Code: Alles auswählen

{
	"message": {
		"id": 29,
		"temperature": 16.8,
		"humidity": 21.0,
		"battery": 1
	},
	"origin": "receiver",
	"protocol": "alecto_ws1700",
	"uuid": "0000-00-00-10-203518",
	"repeats": 1
}
{
	"message": {
		"id": 81.0,
		"temperature": 0.0,
		"humidity": 0.0,
		"battery": 1.0
	},
	"origin": "receiver",
	"protocol": "teknihall",
	"uuid": "0000-00-00-10-203518",
	"repeats": 1
}
{
	"message": {
		"id": 0,
		"temperature": -67.77,
		"humidity": 0.00,
		"battery": 1,
		"channel": 1
	},
	"origin": "receiver",
	"protocol": "tfa",
	"uuid": "0000-00-00-10-203518",
	"repeats": 1
}
{
	"message": {
		"id": 1023,
		"state": "alarm"
	},
	"origin": "receiver",
	"protocol": "secudo_smoke_sensor",
	"uuid": "0000-00-00-10-203518",
	"repeats": 1
}
{
	"message": {
		"systemcode": 16,
		"unitcode": 31,
		"state": "on"
	},
	"origin": "receiver",
	"protocol": "pollin",
	"uuid": "0000-00-00-10-203518",
	"repeats": 1
}
{
	"message": {
		"unitcode": 165888,
		"state": "opened"
	},
	"origin": "receiver",
	"protocol": "ev1527",
	"uuid": "0000-00-00-10-203518",
	"repeats": 1
}
{
	"message": {
		"systemcode": 0,
		"unitcode": 0,
		"state": "on"
	},
	"origin": "receiver",
	"protocol": "pollin",
	"uuid": "0000-00-00-10-203518",
	"repeats": 1
}
{
	"message": {
		"unitcode": 0,
		"state": "opened"
	},
	"origin": "receiver",
	"protocol": "ev1527",
	"uuid": "0000-00-00-10-203518",
	"repeats": 1
}
{
	"message": {
		"systemcode": 0,
		"unitcode": 0,
		"state": "opened"
	},
	"origin": "receiver",
	"protocol": "elro_800_contact",
	"uuid": "0000-00-00-10-203518",
	"repeats": 1
}
{
	"message": {
		"id": 0,
		"temperature": 0.0,
		"humidity": 0,
		"battery": 1,
		"button": 0
	},
	"origin": "receiver",
	"protocol": "tcm",
	"uuid": "0000-00-00-10-203518",
	"repeats": 1
}
{
	"message": {
		"systemcode": 31,
		"unitcode": 30,
		"state": "on"
	},
	"origin": "receiver",
	"protocol": "heitech",
	"uuid": "0000-00-00-10-203518",
	"repeats": 1
}
{
	"message": {
		"unitcode": 16,
		"state": "opened"
	},
	"origin": "receiver",
	"protocol": "ev1527",
	"uuid": "0000-00-00-10-203518",
	"repeats": 1
}
{
	"message": {
		"systemcode": 55,
		"unitcode": 30,
		"state": "on"
	},
	"origin": "receiver",
	"protocol": "elro_800_switch",
	"uuid": "0000-00-00-10-203518",
	"repeats": 1
}
{
	"message": {
		"id": 7,
		"state": "on"
	},
	"origin": "receiver",
	"protocol": "ehome",
	"uuid": "0000-00-00-10-203518",
	"repeats": 1
}
{
	"message": {
		"id": 0,
		"temperature": 0.0,
		"humidity": 0,
		"battery": 1,
		"button": 0
	},
	"origin": "receiver",
	"protocol": "tcm",
	"uuid": "0000-00-00-10-203518",
	"repeats": 1
}
{
	"message": {
		"unitcode": 8192,
		"state": "opened"
	},
	"origin": "receiver",
	"protocol": "ev1527",
	"uuid": "0000-00-00-10-203518",
	"repeats": 1
}
{
	"message": {
		"id": "A15",
		"unit": 63,
		"state": "on"
	},
	"origin": "receiver",
	"protocol": "clarus_switch",
	"uuid": "0000-00-00-10-203518",
	"repeats": 1
}
{
	"message": {
		"id": 0,
		"temperature": 0.0,
		"humidity": 0,
		"battery": 1,
		"button": 0
	},
	"origin": "receiver",
	"protocol": "tcm",
	"uuid": "0000-00-00-10-203518",
	"repeats": 1
}
{
	"message": {
		"id": 0,
		"temperature": -67.77,
		"humidity": 0.00,
		"battery": 1,
		"channel": 1
	},
	"origin": "receiver",
	"protocol": "tfa",
	"uuid": "0000-00-00-10-203518",
	"repeats": 1
}
{
	"message": {
		"id": 0,
		"temperature": -67.77,
		"humidity": 0.00,
		"battery": 1,
		"channel": 1
	},
	"origin": "receiver",
	"protocol": "tfa",
	"uuid": "0000-00-00-10-203518",
	"repeats": 1
}
{
	"message": {
		"id": 0,
		"temperature": 0.0,
		"humidity": 0,
		"battery": 1,
		"button": 0
	},
	"origin": "receiver",
	"protocol": "tcm",
	"uuid": "0000-00-00-10-203518",
	"repeats": 1
}
{
	"message": {
		"id": 0,
		"temperature": -67.77,
		"humidity": 0.00,
		"battery": 1,
		"channel": 1
	},
	"origin": "receiver",
	"protocol": "tfa",
	"uuid": "0000-00-00-10-203518",
	"repeats": 1
}
{
	"message": {
		"id": 0,
		"temperature": -67.77,
		"humidity": 0.00,
		"battery": 1,
		"channel": 1
	},
	"origin": "receiver",
	"protocol": "tfa",
	"uuid": "0000-00-00-10-203518",
	"repeats": 1
}
Sorry. Spoiler geht auch nicht hier :(
Zefram Cochrane, 5. April 2063. Cochrane unternimmt den ersten Warpflug der Menschheit, was den Besuch der Vulkanier zurfolge hat (Star Trek 8 - Der Erste Kontakt)

Benutzeravatar
treki
Beiträge: 56
Registriert: 25.10.2014 22:48:40

Re: Brauche Hilfe in einem Script

Beitrag von treki » 02.08.2019 07:40:33

Ich muss mal pennen gehn.
Vllt fällt Dir noch was ein.
Wie gesagt, das ganze Projekt (welches schon lange läuft) ist hier: http://www.ltspiceusers.ch/showthread.php?t=350
Zefram Cochrane, 5. April 2063. Cochrane unternimmt den ersten Warpflug der Menschheit, was den Besuch der Vulkanier zurfolge hat (Star Trek 8 - Der Erste Kontakt)

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: Brauche Hilfe in einem Script

Beitrag von eggy » 02.08.2019 07:48:17

treki hat geschrieben: ↑ zum Beitrag ↑
02.08.2019 07:29:36
Sorry. Spoiler geht auch nicht hier :(
aber NoPaste - Link gibts links im Menü

Code: Alles auswählen

eggy@rechner:/temp $ read ID HUM TEMP BAT < <(awk -F [:,] '/"id":/{ID=$2} /"humidity":/{HUM=$2} /"battery":/{BAT=$2} /"temperature":/{TEMP=$2} /"protocol": "alecto_ws1700"/{print ID HUM TEMP BAT}' zeug.txt )
eggy@rechner:/temp $ echo $ID $HUM $TEMP $BAT
29 21.0 16.8 1
Als Script gehts auch, muss aber Bash sein. Mit sh gibts "Syntax error: redirection unexpected"

Antworten