ubuntuusers.de

Die log Zeile Spaltenweise in einzelne Variablen schreiben.

Status: Ungelöst | Ubuntu-Version: Kein Ubuntu
Antworten |

Kilowatt

(Themenstarter)

Anmeldungsdatum:
4. Dezember 2017

Beiträge: 63

Wohnort: Salzgitter

Danke für deine Hilfe. Ich würde ja gerne dein ersten Vorschlag annehmen, habe auch versucht den irgendwie dranzubasteln, habe aber nicht ganz verstanden wie es dann funktionieren soll? Eine unformatierte Logdatei einlesen und durch diesen String in eine andere ausgeben ? So ?

1
echo 'log.txt' | \ awk -v OFS=, '{split($1,d,".");gsub(",",".");$20/=10;sub(","," ");print}' -> log1.txt

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Nee,

  1. der Logging-Teil sähe ganz simpel so aus:

    1
    2
    3
    4
    #!/bin/sh
    
    stty -F /dev/ttyUSB0 19200 
    cat  /dev/ttyUSB0  >> log_alles.txt
    

    (höchstens noch mit einer while- Schleife drum herum, wenn das Logging automatisch wieder starten soll, falls die Schnittstelle mal abschmiert)

  2. der Auswerteteil sähe dann ± so aus:

    1
    2
    3
    #!/bin/sh
    
    tail -f  log_alles.txt  |  sed -u '/Typ/,/Messzeit/d;/^[ \t]*$/d; s/,/./g'  |  awk '{OFS=","; $20/=10; print strftime("%Y/%m/%d-") $0; fflush()}'  >> messungen.txt
    

    (da habe ich jetzt noch den Puffer-Flush ergänzt, damit er ohne Verzögerung alles in Echtzeit ausgibt)

Die Auswertung kannst Du völlig unabhängig vom Loggen später starten.

track

Kilowatt

(Themenstarter)

Anmeldungsdatum:
4. Dezember 2017

Beiträge: 63

Wohnort: Salzgitter

Wau!!! Teste ich gleich mal -☺

Kilowatt

(Themenstarter)

Anmeldungsdatum:
4. Dezember 2017

Beiträge: 63

Wohnort: Salzgitter

Haut noch nicht 100% hin

2017/12/24-03:19:02,029.2,033.6,028.0,017.7,005.7,004.5,035.5,032.7,008.9,050,050,099,030,110,080569383,001314245,3.4,00232,750
2017/12/24-03:19:12,029.2,033.6,028.0,017.7,005.7,004.4,035.5,032.8,008.9,050,050,099,030,110,080569403,001314250,3.6,00232,780
2017/12/24-03:19:22,029.2,033.6,028.1,017.7,005.7,004.4,035.6,032.9,008.8,050,050,099,030,110,080569423,001314255,3.4,00234,750
2017/12/24-03:19:32,029.2,033.4,028.1,017.7,005.8,004.7,035.4,032.7,009.0,050,050,099,030,110,080569438,001314260,3.8,00234,780
2017/12/24-03:19:42,029.2,033.2,028.1,017.7,005.9,004.9,035.2,032.5,008.9,050,050,099,030,110,080569458,001314265,3.8,00232,750
2017/12/24-03:19:52,029.2,033.1,028.2,017.7,005.9,005.0,035.1,032.2,009.0,050,050,099,030,110,080569477,001314265,3.8,00234,600

Kilowatt

(Themenstarter)

Anmeldungsdatum:
4. Dezember 2017

Beiträge: 63

Wohnort: Salzgitter

Dieser String war fast gut... Wieso nicht einfach von $20 auf $19 gehen, dann muss doch alles passen oder ?

1
2
3
sed -u'/Typ/,/Messzeit/d;/^[ \t]*$/d; s/,/./g' /dev/ttyUSB0 | awk '{OFS=","; $20/=10; print strftime("%Y/%m/%d-") $0}' >> log.txt

2017/12/24-01:16:50,029.2,035.2,029.7,017.5,005.3,005.3,058.3,031.2,008.6,000,050,100,030,110,080558319,001312060,4.1,00232,750

Kilowatt

(Themenstarter)

Anmeldungsdatum:
4. Dezember 2017

Beiträge: 63

Wohnort: Salzgitter

@track

Noch ein mal Herzlichen Dank meiner seits, es funktioniert jetzt perfekt! Es wurde wie Du auch vorausgesagt hast, die falsche Spalte durch 10 geteilt. Habe einfach statt $20 die $19 genommen, passt!!!-😉 Unten steht das Ergebnis.

1
sed -u'/Typ/,/Messzeit/d;/^[ \t]*$/d; s/,/./g' /dev/ttyUSB0 | awk '{OFS=","; [mark]$19/=10;[/mark] print strftime("%Y/%m/%d-") $0}' >> log.txt
2017/12/24-03:50:01,029.2,035.3,030.0,017.7,004.0,006.3,062.0,029.6,008.8,050,050,100,030,110,080572705,001315120,4.0,23.2,07500
2017/12/24-03:50:11,029.2,035.3,030.0,017.7,004.0,006.4,062.0,029.7,008.7,050,050,100,030,110,080572720,001315125,4.0,23.4,07500
2017/12/24-03:50:21,029.2,035.2,030.0,017.7,004.0,006.4,061.9,029.7,008.8,050,050,099,030,110,080572740,001315130,4.0,23.2,07800
2017/12/24-03:50:31,029.2,035.2,030.0,017.7,004.0,006.3,061.9,029.7,008.8,050,050,100,030,110,080572760,001315135,4.0,23.2,07800
2017/12/24-03:50:41,029.2,035.3,030.0,017.7,004.0,006.4,061.9,029.7,008.8,050,050,100,030,110,080572780,001315140,4.0,23.4,07500
2017/12/24-03:50:51,029.2,035.3,030.0,017.7,004.0,006.4,062.0,029.7,008.8,050,050,100,030,110,080572800,001315145,4.0,23.2,07500
2017/12/24-03:51:01,029.2,035.3,030.0,017.7,004.0,006.4,061.9,029.7,008.8,050,050,100,030,110,080572820,001315150,4.0,23.2,07500
2017/12/24-03:51:11,029.2,035.3,030.0,017.7,004.0,006.4,061.9,029.7,008.8,050,050,100,030,110,080572840,001315155,4.0,23.4,07500

Kilowatt

(Themenstarter)

Anmeldungsdatum:
4. Dezember 2017

Beiträge: 63

Wohnort: Salzgitter

@ track

Hier ist das Ergebnis unserer nächtlichen Aktion. Alles interaktiv, beide Bereich X und Y können gezoomt und die Range gewählt/verschoben werden. Die Diagramm wurde mit Dygraph.js erstellt.

Bilder

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Kilowatt schrieb:

Hier ist das Ergebnis unserer nächtlichen Aktion. Alles interaktiv, beide Bereich X und Y können gezoomt und die Range gewählt/verschoben werden. Die Diagramm wurde mit Dygraph.js erstellt.

Hübsch ! - muss ich schon sagen, richtig gut ! 👍

Allerdings ist mir noch ein Denkfehler aufgefallen, bei meinen Vorschlägen letzte Nacht: (jaja- es war schon spät ! ...)

Du willst ja nicht wirklich den Tagesstempel für den Zeitpunkt der Auswertung haben, sondern den zum Zeitpunkt des Mitloggens.
Da hatte ich Blödsinn geschrieben: der awk- Befehl mit strftime() gehört natürlich in den Logging-Teil und nicht in die Auswertung. - Sonst siehst Du bei nachträglicher Auswertung ja ein falsches Datum ! (nämlich das von der Auswertung und nicht das von der Messung)

So wäre es also korrekt:

  1. der Logging-Teil:

    1
    2
    3
    4
    #!/bin/sh
    
    stty -F /dev/ttyUSB0 19200 
    awk '/^[0-2][0-9]:[0-5]/ {$1=strftime("%Y/%m/%d-") $1} {print; fflush()}'  /dev/ttyUSB0  >> log_alles.txt
    

    (mit Datum bei allen Zeilen mit Zeitstempel vorne, der Rest bleibt wie er ist)

  2. der Auswerteteil dann natürlich ohne Datum:

    1
    2
    3
    #!/bin/sh
    
    tail -f  log_alles.txt  |  sed -u '/Typ/,/Messzeit/d;/^[ \t]*$/d; s/,/./g'  |  awk '{OFS=","; $19/=10; print; fflush()}'  >> messungen.txt
    

Auf diese Weise sollte es jetzt aber stimmen ... ☺

LG, und Dir jetzt noch ein gutes Weihnachtsfest !

track

Kilowatt

(Themenstarter)

Anmeldungsdatum:
4. Dezember 2017

Beiträge: 63

Wohnort: Salzgitter

@ track

Habe die beiden Scripts ausprobiert, irgendwie verhält sich ganz seltsam. In die erste Datei wird so geschrieben:

2017/12/25-22:09:42 030,0 031,0 026,2 016,8 000,4 002,9 056,6 026,0 004,7 050 050 099 030 110 080625421 001327395 3,6 00232 06000

2017/12/25-22:09:52 030,0 031,1 026,2 016,8 000,4 002,9 056,6 026,0 004,6 000 050 099 030 110 080625437 001327400 3,5 00232 06000

2017/12/25-22:10:02 030,0 031,1 026,2 016,8 000,4 002,9 056,6 026,1 004,6 050 050 099 030 110 080625449 001327405 3,4 00232 06000

2017/12/25-22:10:12 030,0 031,1 026,2 016,8 000,4 002,9 056,6 026,0 004,6 050 050 099 030 110 080625466 001327410 3,6 00232 06000

in die zweite mal normal, mal so:

,,,,,,,,,,,,,,,,,,0
2017/12/25-21:18:34,030.0,030.2,025.4,016.7,000.2,002.8,053.4,025.1,004.8,050,050,099,030,111,080621125,001326025,3.6,23.2,06240

,,,,,,,,,,,,,,,,,,0
2017/12/25-21:18:44,030.0,030.1,025.4,016.7,000.2,002.9,053.5,025.2,004.8,050,050,099,030,111,080621141,001326025,3.6,23.2,06000

,,,,,,,,,,,,,,,,,,0
2017/12/25-21:18:54,030.0,030.2,025.4,016.7,000.2,002.9,053.5,025.2,004.7,050,050,099,030,111,080621153,001326030,3.6,23.2,06000

,,,,,,,,,,,,,,,,,,0
2017/12/25-22:08:42,030.0,031.1,026.2,016.8,000.4,002.8,056.5,026.0,004.6,050,050,099,030,110,080625325,001327370,3.6,23.4,06240

Momentan wieder ganz normal:

2017/12/25-22:08:12,030.0,031.1,026.2,016.8,000.5,002.8,056.4,025.9,004.7,050,050,099,030,110,080625281,001327355,3.4,23.2,06000
2017/12/25-22:08:22,030.0,031.0,026.2,016.8,000.4,002.8,056.5,026.0,004.7,050,050,099,030,110,080625297,001327360,3.6,23.2,06240
2017/12/25-22:08:32,030.0,031.0,026.2,016.8,000.4,002.8,056.5,026.0,004.6,050,050,099,030,110,080625313,001327365,3.5,23.2,06000

Was noch seltsam ist, wenn ich die Datei öffne um mir die Logdaten anzusehen, sehe ich nichts, die Datei Größe wächst aber ständig und die Diagramm mir aktuellen Werten wird gezeichnet?

Heute Mittag nach dem aus und einschalten hatte ich sowas: Es hat auch aufgehört Diagramme zu zeichnen. Noch mit alten Script:

1
2
3
#!/bin/sh
stty -F /dev/ttyUSB0 19200
sed -u '/Typ/,/Messzeit/d;/^[ \t]*$/d; s/,/./g' /dev/ttyUSB0 | awk '{OFS=",";$19/=10; print strftime("%Y/%m/%d-") $0}' >> /var/www/html/log.txt
2017/12/25-13:27:59,030.0,030.8,025.6,016.8,002.1,005.3,057.3,025.3,008.0,050,062,099,030,111,080613157,001324245,4.3,23.2,07500
2017/12/25-13:28:09,030.0,030.7,025.6,016.8,002.1,005.3,057.3,025.3,007.9,050,062,099,030,111,080613177,001324250,4.3,23.2,07800
2017/12/25-13:28:19,030.0,030.8,025.6,016.8,002.2,005.3,057.2,025.3,008.0,050,062,099,030,111,080613197,001324255,4.4,23.2,07500
2017/12/25-���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������X�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������

Kilowatt

(Themenstarter)

Anmeldungsdatum:
4. Dezember 2017

Beiträge: 63

Wohnort: Salzgitter

Ich lasse erstmal so laufen, bis jetzt funktionierts... 👍

In dem Datenstring von dem Heizungsregler sind Daten drin die als Diagramm mir nichts nutzen. Ich habe noch weitere Daten von anderen Datenquellen als Variablen da, die eigentlich in diesen Datenstring gehören. Z.B. Verdichterstrom (0-40A), Verdicher Frequenz (0-92 Hz), Expansionsventil A und B Öffnungsgrad (0-500 Schritte), Lufterstuffe(1-16). Wie kann man die Spalten Nr. 12,13,16,17 und 18 durch die andere Werte aus Variablen ersetzen, oder wenn es einfacher ist einfach hinzufügen,(statt 20 Spalten 26 Spalten) und zwar bevorzugt bevor den ganzen String in die Logdatei geschrieben wird?

Kilowatt

(Themenstarter)

Anmeldungsdatum:
4. Dezember 2017

Beiträge: 63

Wohnort: Salzgitter

Habe paar Screenshots gemacht wo man sieht die Dateidatum steht bei 26.12.2017 7:07, wenn man die Datei öffnet,sind keine neue Einträge da: 25.12.2017 22:08. Die Diagramm wird sauber gezeichnet 👍

Bilder

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Kilowatt schrieb:

@ track

Habe die beiden Scripts ausprobiert, irgendwie verhält sich ganz seltsam. ...

in die zweite mal normal, mal so: ...

Momentan wieder ganz normal: ...

Alle diese Probleme betreffen den Teil mit der Datenerfassung - deshalb würde ich diese Fragen in Deinen Vorgängerstrang auslagern und dann dort weiter diskutieren.
Dann sind diese beiden Themen schön sauber getrennt, und wir können uns hier ganz der Datenauswertung widmen.

LG,

track

Kilowatt

(Themenstarter)

Anmeldungsdatum:
4. Dezember 2017

Beiträge: 63

Wohnort: Salzgitter

In dem Datenstring von dem Heizungsregler sind Daten drin die als Diagramm mir nichts nutzen. Ich habe noch weitere Daten von anderen Datenquellen als Variablen da, die eigentlich in diesen Datenstring gehören. Z.B. Verdichterstrom (0-40A), Verdicher Frequenz (0-92 Hz), Expansionsventil A und B Öffnungsgrad (0-500 Schritte), Lufterstuffe(1-16).

Wie kann man die Spalten Nr. 12,13,16,17 und 18 durch die andere Werte aus Variablen ersetzen,und paar neue hinzufügen,(statt 20 Spalten 26 Spalten) und zwar bevorzugt bevor den ganzen String in die Logdatei "messungen.txt" geschrieben wird ?

1
tail -f  log_alles.txt  |  sed -u '/Typ/,/Messzeit/d;/^[ \t]*$/d; s/,/./g'  |  awk '{OFS=","; $19/=10; print; fflush()}'  >> messungen.txt

Ich möchte mit Variable $temp die Variable $12 ersetzen, oder als $21 hinzufügen.

1
2
3
4
5
6
7
8
#! /bin/bash
 # Temperatur auslesen
tempread=`cat /sys/bus/w1/devices/10-000802b4ba0e/w1_slave`
#Formatieren
temp=`echo "scale=2; "\`echo ${tempread##*=}\`" / 1000" | bc`
 
#Ausgabe
echo "Die gemessene Temperatur beträgt" $temp "°C"

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4772

Wohnort: Berlin

@Kilowatt: Die Variable $12 existiert ja nur in dem AWK-Skript, und da würde ich das dann auch lösen, denn AWK kann nicht nur rechnen, sondern das sogar mit Dezimalbrüchen, man braucht also kein bc dafür.

Mal so am Rande: An dem Shell-Skript sieht man ganz schön warum man $(…) anstalle von `…` verwenden sollte. Das ist wesentlich übersichtlicher wenn man das verschachteln will/muss.

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Kilowatt schrieb:

Wie kann man die Spalten Nr. 12,13,16,17 und 18 durch die andere Werte aus Variablen ersetzen,und paar neue hinzufügen ... ?

Das ist weiter kein Problem. - immerhin kann awk ohne weiteres aus verschiedenen Dateien lesen.

Das Problem wird viel eher sein, die beiden Datenströme den Zeitstempeln nach zusammen zu führen, so dass auch immer die zusammengehörigen Messwerte zusammen in einer Zeile landen.
(Denn vermutlich kann man ja nicht blind "1 rechts 1 links" blind zusammenführen ... 😉 → also: nach Zeitstempel synchronisieren !)

Der Rest ist denkbar einfach: wenn Du z.B. nach Spalte 12 eine extra Spalte einfügen willst, hängst Du sie einfach an die Spalte an:

1
2
# im awk-Skript [https://www.gnu.org/software/gawk/manual/html_node/Concatenation.html als Konkatenation]:
    $12= $12 FS temperatur;

LG,

track