ubuntuusers.de

Doppelte Datum-Einträge in Log Datei.

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

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Kilowatt schrieb:

fgrep -v -e '[:alpha:]' echo.txt >"info.txt"

Wo ist der Fehler ?

Schau doch einfach mal im Wiki nach ... 😉 :

grep -v '[[:alpha:]]'  echo.txt  >  info.txt

... und schon geht es.

Aber wenn ich mir Deine Daten so angucke, gäbe es noch eine wesentlich einfachere Möglichkeit.
Im Grunde willst Du doch immer die Zeilen mit einem Zeitstempel haben ?! - und der enthält immer das Muster ":[Ziffer]" (was sonst nicht vorkommt).

Also reicht ganz einfach:

1
grep ':[0-5]'  rohdaten.txt  >  messzeilen.txt

und alle uninteressanten Zeilen sind weg. (hier ist sogar egal ob Du das Datum schon davor stehen hast oder nicht !)

LG,

track

Kilowatt

(Themenstarter)

Anmeldungsdatum:
4. Dezember 2017

Beiträge: 63

Wohnort: Salzgitter

@ track

Es ist unglaublich, dein geänderter Script funktioniert super! Vor allem muss ich den string nicht extra ausführen, der überprüft die Daten bereits beim antreffen, Top!!! Auf diese Idee bin ich nicht gekommen. Als ich es ersten mal ausprobiert habe, hat sich nichts getan, erst später habe ich herausgefunden das es bis zu 5 Minuten dauert bis die Daten in die Logdatei geschrieben werden,(vollständig), davor wurden die Daten direkt in die Logdatei geschrieben. Keine Ahnung warum jetzt so ist, Hauptsache es funktioniert.

1
2
#!/bin/sh
sed '/Typ/,/Messzeit/d' /dev/ttyUSB0  |  while read line; do

Jetzt habe ich ein andere Anliegen: Jetzt wo die Logdaten ordentlich aufbereitet wurden, muss ich die jungste Werte aus jeder Spalte (sind 20 Spalten) in die 20 Variablen geschrieben werden. Am besten direkt von der $line, oder von /dev/ttyUSB0.

Irgendwie so ?

#!/bin/sh
stty -F /dev/ttyUSB0 19200
sed '/Typ/,/Messzeit/d' /dev/ttyUSB0 | while read line; do
     if [ -n "${line}" ]; then
         echo "$(date '+%d.%m.%Y') $line"

 Hier zwischen könnte man dden Script plazieren.

     fi
 done  >> /home/pi/rec.log
 

cat /dev/ttyUSB0 | awk '{ print $1" "$2" "$3" "$4}'      # irgendwie sowas, bin fleißig am lernen.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13323

Kilowatt schrieb:

fgrep -v -e '[:alpha:]' echo.txt >"info.txt"

Wo ist der Fehler ?

Schau mal auf die Manpage von fgrep. Warum funktioniert die Variante mit sed nicht, die die initialen Zeilen löscht?

Kilowatt

(Themenstarter)

Anmeldungsdatum:
4. Dezember 2017

Beiträge: 63

Wohnort: Salzgitter

Mit sed funktioniert es wie ich oben geschrieben habe super. Mach selbständig den Jop ohne das ich ein Crontab dafür starten muss. Jetzt muss ich die neuste Spaltenwerte extrahieren und in Variablen schreiben um von da aus in der Visualisierung darstellen.

Dieser Script funktioniert schon ganz gut, nur wie lese ich die Variablen aus ?

cat /dev/ttyUSB0 | awk '{ print $1" "$2" "$3" "$4 "$5" "$6" "$7" "$8" "$9" "$10" "$11" "$12" "$13" "$14" "$15" "$16" "$17" "$18" "$19" "$20" }' 

<iframe src="<?php echo $1; ?>width="250" height="60" frameborder="0"> # irgendwie klappt nicht so wie hier steht.

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Kilowatt schrieb:

... Als ich es ersten mal ausprobiert habe, hat sich nichts getan, erst später habe ich herausgefunden das es bis zu 5 Minuten dauert bis die Daten in die Logdatei geschrieben werden,(vollständig), davor wurden die Daten direkt in die Logdatei geschrieben. Keine Ahnung warum jetzt so ist, Hauptsache es funktioniert.

Aber dazu fällt mir etwas ein, nämlich das Stichwort "Line Buffering" (in diesem Fall von sed):
Das sammelt nämlich erst soundsoviele Zeichen, bevor es mal einen Schreibvorgang auslöst. Man merkt sowas besonders, wenn die Daten langsam hereintröpfeln.

Aber - man kann das abschalten, mit der sed - Option --unbuffered ... und dann ist sed auch wieder echtzeitfähig. 😉

Jetzt habe ich ein andere Anliegen: Jetzt wo die Logdaten ordentlich aufbereitet wurden, muss ich die jungste Werte aus jeder Spalte (sind 20 Spalten) in die 20 Variablen geschrieben werden. Am besten direkt von der $line, oder von /dev/ttyUSB0.

Das sieht mir doch sehr nach einem neuen Thema aus: also am besten in einem neuen Strang !

Und ich würde auch programmtechnisch die Auswertung so gut wie möglich von der Datenerfassung trennen.
Also nicht nochmals an dem USB-Device herumfummeln, oder Dein date-Skript bis zur Unkenntlichkeit aufblähen, sondern die Protokolldatei einfach nochmal getrennt mit tail --follow anzapfen, und dann auseinanderzupfen. (ruhig komplett mit awk - das kann viel mehr als man denkt !)

LG,

track

Kilowatt

(Themenstarter)

Anmeldungsdatum:
4. Dezember 2017

Beiträge: 63

Wohnort: Salzgitter

@ track

Danke vielmals für die Erklärung. Jetzt bin ich beruhigt und lasse es so.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13323

Also, ich denke, die Lösung sollte dies sein:

1
2
3
4
5
#!/bin/sh

sed -u '/Typ/,/Messzeit/d;/^[ \t]*$/d' /dev/ttyUSB0 | while read line; do
  echo "$(date '+%d.%m.%Y') $line"
done >> /home/pi/record.log

Damit werden nicht nur Leerzeilen sondern auch Zeilen aus Leerzeichen und Tabs gefiltert. Das macht auch die Abfrage auf Leerzeile in der Schleife überflüssig. Und ja, unbuffered (-u) sollte auch sein.

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Na, dann kannst Du die Zeile 4 auch noch ein bisschen zusammenfassen. Denn date kann selber wunderschön direkt formatieren: 😉

1
2
3
4
5
#!/bin/sh

sed -u '/Typ/,/Messzeit/d;/^[ \t]*$/d' /dev/ttyUSB0 | while read line; do
    date "+%d.%m.%Y $line"
done >> /home/pi/record.log

Denn das echo + Command Substitution ist hier einfach nur unnötig ... (und dann ist es perfekt !)

LG

track

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13323

track schrieb:

Na, dann kannst Du die Zeile 4 auch noch ein bisschen zusammenfassen. Denn date kann selber wunderschön direkt formatieren: 😉

1
2
3
4
5
#!/bin/sh

sed -u '/Typ/,/Messzeit/d;/^[ \t]*$/d' /dev/ttyUSB0 | while read line; do
    date "+%d.%m.%Y $line"
done >> /home/pi/record.log

Denn das echo + Command Substitution ist hier einfach nur unnötig ... (und dann ist es perfekt !)

Nein, ist es nicht. Diese Variante hatte ich auch erwogen, aber ich habe das absichtlich so gelassen, weil diese Variante von Dir das Problem hat, dass sie die Logzeile nicht unmodifiziert schreibt. Wenn da nämlich zufällig irgendwelche Formatierungsanweisungen von date auftauchen, werden die ersetzt. Und das will man nicht.

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Soweit ich das verstanden hatte, kommen hier bei den Daten nur noch ausschließlich Zahlenkolonnen vor, und ganz sicher kein "%"-Zeichen ?
Alles andere wurde vorher mit sed herausgefiltert ...

Sonst, für den allgemeinen Fall (→ beliebige Daten) hast Du mit Deiner Überlegung natürlich schon Recht.

LG,

track

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13323

track schrieb:

Soweit ich das verstanden hatte, kommen hier bei den Daten nur noch ausschließlich Zahlenkolonnen vor, und ganz sicher kein "%"-Zeichen ?

Ja, aber so etwas kann sich ja ändern. Und dann merkt es niemand, weil es nicht mal einen Fehler gibt.

Sonst, für den allgemeinen Fall (→ beliebige Daten) hast Du mit Deiner Überlegung natürlich schon Recht.

Ich irre da lieber auf der Seite der Robustheit als das letzte Quäntchen Performance herauszukitzeln. Und auch wenn es in diesem Fall kein Problem sein sollte (und auch keins würde, weil diese Zeichenfolgen nie im Log auftauchen), dann kopiert vielleicht jemand den Code ohne sich darüber bewusst zu sein, dass er ein Problem hat oder bekommen könnte.

Kilowatt

(Themenstarter)

Anmeldungsdatum:
4. Dezember 2017

Beiträge: 63

Wohnort: Salzgitter

Bin neugierig, gehe ich gleich testen...

1
2
3
4
5
#!/bin/sh
stty -F /dev/ttyUSB0 19200  # ohne baufratte setzen habe ich keine Verbindung nach Reboot.Wo kann ich die Baudrate in Conf. Datei ändern? Habe bis jetzt nicht gefunden.
sed -u '/Typ/,/Messzeit/d;/^[ \t]*$/d' /dev/ttyUSB0 | while read line; do
  echo "$(date '+%d.%m.%Y') $line"
done >> /home/pi/record.log

Kilowatt

(Themenstarter)

Anmeldungsdatum:
4. Dezember 2017

Beiträge: 63

Wohnort: Salzgitter

Bin neugierig, gehe ich gleich testen...

1
2
3
4
5
#!/bin/sh
stty -F /dev/ttyUSB0 19200  # ohne baufratte setzen habe ich keine Verbindung nach Reboot.Wo kann ich die Baudrate in Conf. Datei ändern? Habe bis jetzt nicht gefunden.
sed -u '/Typ/,/Messzeit/d;/^[ \t]*$/d' /dev/ttyUSB0 | while read line; do
  echo "$(date '+%d.%m.%Y') $line"
done >> /home/pi/record.log

Edit: Funktioniert!

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Nachdem wir hier im Folgestrang die Daten-Erfassung und die Daten-Auswertung säuberlich getrennt hatten, hat sich das Logging-Skript etwas geändert.

Es sieht jetzt so aus::

...
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
    

→ Dies also als Ausgangspunkt für die nachfolgende Diskussion.


Kilowatt schrieb:

@ 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

Das hatten wir ja schon hier im Vorgänger-Strang ...

Wenn das weg soll, kannst Du dem awk ja sagen, dass es alle leeren Zeilen wegschmeißen soll. Also ergänzen:

1
awk ... '{ /^$/{next} .... }'

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

Sowas ist ein Folgefehler. Du müsstest jetzt mal gucken, was in der Datei log_alles.txt unter genau diesem Zeitstempel steht. Dann können wir das Problem rekonstruieren.

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����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������

Da ist die Schnittstelle wohl mal gänzlich ausgeflippt und Amok gelaufen (oder hat sich nur die Datenrate verändert ?). In solch einem Fall hilft wahrscheinlich nur ein Neustart des Loggings. Vor allem sollte die Schnittstelle neu initialisiert werden.

Wenn das jetzt öfters vorkommt, sollte man das vielleicht mal einbauen.

LG,

track

Kilowatt

(Themenstarter)

Anmeldungsdatum:
4. Dezember 2017

Beiträge: 63

Wohnort: Salzgitter

@ track

Hallo track, wo soll ich das '{ /^$/{next}' einfügen damit in jede Zeile geschrieben wird? Habe an verschedenen Stellen versucht, bringt nur Fehlermeldungen.

1
2
3
4
5
'{ /^$/{next}'

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

Momentan läuft alles rund 👍

Bilder