Brauche Hilfe in einem Script

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
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"

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:58:18

Interessant.
Kriege so "state": "on" als antwort und nicht "state": "up"
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
heisenberg
Beiträge: 3559
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Brauche Hilfe in einem Script

Beitrag von heisenberg » 02.08.2019 10:21:49

Debianjq ist ein sehr nützliches Werkzeug um JSON-Daten zu extrahieren:

Aus Deinen obigen Daten...

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
}
...
z. B. so:

Alle uuids extrahieren:

Code: Alles auswählen

jq -r ".uuid"  <data.json

#Ausgabe
0000-00-00-10-203518
0000-00-00-10-203518
...
Nur uuids von bestimmten message/ids:

Code: Alles auswählen

jq -r 'select((.message.id==29) or (.message.id==7))|.uuid' <data.json 

#Ausgabe
0000-00-00-10-203518
0000-00-00-10-203518
Werte in Variablen einlesen und ausgeben:

Code: Alles auswählen

while read id temper humid batt ; do
  echo $id $temper $humid $batt
done < <(jq -r '.[] | (.id|tostring) + " " +(.temperature|tostring) + " " 
+ (.humidity|tostring) + " " + (.battery|tostring) ' <data.json 2>/dev/null)

#Ausgabe
29 16.8 21 1
81 0 0 1
0 -67.77 0 1
1023 null null null
null null null null
null null null null
null null null null
null null null null
null null null null
0 0 0 1
null null null null
null null null null
null null null null
7 null null null
0 0 0 1
null null null null
A15 null null null
0 0 0 1
0 -67.77 0 1
0 -67.77 0 1
0 0 0 1
0 -67.77 0 1
0 -67.77 0 1
Siehe: https://stedolan.github.io/jq/
Jede Rohheit hat ihren Ursprung in einer Schwäche.

Antworten