bestimmte Zeile einer csv finden und löschen

cliodriver

Mitglied
Hallo

ein sh-script erstellt mir eine csv datei mit folgenden daten

Code:
27.12.2022 19:29;1;1,2;7,5;60,1;0;56,1;0;0;0;0;0;0;0;0;9;1;75;0;19;11;140;1000;56,8;58;-0,9;1,3;50,3;120;41,7;-20;-20;1;-1;0;0;0;0;3;0;0;0;0;54;2;0;107;50,5;0;100;0;0;13;120;25;-20;27,4;28;24;18;1;1;44,0;45;23,6;12,4;1;1;49,0;50;20;20;1;1;-20;0;20;20;0;1;-20;0;20;20;0;1;-20;0;20;20;0;1;-20;0;20;20;0;1;-20;0;20;20;0;1;21,7;0;75,7;0;-20;0;-20;0;-20;0;0;50;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;73,4;0;93150,2;100;3;3;3;0;1;6;0;0;0;0;0;0;0;0;0;2;0;10;3;0;0;0;50;0;0;49B;1000;7800;0;0;0;0;200;
27.12.2022 19:27;1;1,2;7,5;60,1;0;56,2;0;0;0;0;0;0;0;0;9;1;75;0;19;11;140;1000;56,8;58;-0,9;1,3;51,3;120;41,7;-20;-20;1;-1;0;0;0;0;3;0;0;0;0;55;2;0;107;50,5;0;100;0;0;13;120;25;-20;27,2;28;24;18;1;1;44,0;45;23,6;12,4;1;1;49,0;50;20;20;1;1;-20;0;20;20;0;1;-20;0;20;20;0;1;-20;0;20;20;0;1;-20;0;20;20;0;1;-20;0;20;20;0;1;21,7;0;75,7;0;-20;0;-20;0;-20;0;0;50;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;73,4;0;93150,2;100;3;3;3;0;1;6;0;0;0;0;0;0;0;0;0;2;0;10;3;0;0;0;50;0;0;49B;1000;7800;0;0;0;0;200;
27.12.2022 19:25;1;1,2;7,5;60,1;0;56,4;0;0;0;0;0;0;0;0;9;1;75;0;19;11;140;1000;56,8;58;-0,6;1,4;52,3;120;42,0;-20;-20;1;-1;0;0;0;0;3;0;0;0;0;56;2;0;107;50,5;0;100;0;0;13;120;25;-20;27,2;28;24;18;1;1;44,0;45;23,6;12,4;1;1;49,2;50;20;20;1;1;-20;0;20;20;0;1;-20;0;20;20;0;1;-20;0;20;20;0;1;-20;0;20;20;0;1;-20;0;20;20;0;1;21,7;0;75,7;0;-20;0;-20;0;-20;0;0;50;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;73,4;0;93150,2;100;3;3;3;0;1;6;0;0;0;0;0;0;0;0;0;2;0;10;3;0;0;0;50;0;0;49B;1000;7800;0;0;0;0;200;
27.12.2022 19:23;1;1,2;7,5;60,1;0;56,4;0;0;0;0;0;0;0;0;9;1;75;0;19;11;140;1000;56,8;58;-0,6;1,4;53,1;120;42,0;-20;-20;1;-1;0;0;0;0;3;0;0;0;0;57;2;0;107;50,5;0;100;0;0;13;120;25;-20;27,2;28;24;18;1;1;44,0;45;23,6;12,4;1;1;49,5;50;20;20;1;1;-20;0;20;20;0;1;-20;0;20;20;0;1;-20;0;20;20;0;1;-20;0;20;20;0;1;-20;0;20;20;0;1;21,7;0;75,7;0;-20;0;-20;0;-20;0;0;50;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;73,4;0;93150,2;100;3;3;3;0;1;6;0;0;0;0;0;0;0;0;0;2;0;10;3;0;0;0;50;0;0;49B;1000;7800;0;0;0;0;200;
27.12.2022 19:20
27.12.2022 19:18;1;1,2;7,5;60,4;0;56,6;0;0;0;0;0;0;0;0;10;1;75;0;19;11;140;1000;57,0;58;-0,6;1,4;54,9;120;42,2;-20;-20;1;-1;0;0;0;0;3;0;0;0;0;59;2;0;107;50,5;0;100;0;0;13;120;26;-20;27,2;28;24;18;1;1;44,3;45;23,6;12,4;1;1;49,5;50;20;20;1;1;-20;0;20;20;0;1;-20;0;20;20;0;1;-20;0;20;20;0;1;-20;0;20;20;0;1;-20;0;20;20;0;1;21,7;0;75,7;0;-20;0;-20;0;-20;0;0;50;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;73,4;0;93150,2;100;3;3;3;0;1;6;0;0;0;0;0;0;0;0;0;2;0;10;3;0;0;0;50;0;0;49B;1000;7800;0;0;0;0;200;
27.12.2022 19:16;1;1,2;7,5;60,4;0;56,8;0;0;0;0;0;0;0;0;9;1;75;0;19;11;140;1000;57,0;58;-0,6;1,4;55,7;120;42,2;-20;-20;1;-1;0;0;0;0;3;0;0;0;0;60;2;0;107;50,5;0;100;0;0;13;120;26;-20;27,2;28;24;18;1;1;44,3;45;23,6;12,4;1;1;49,5;50;20;20;1;1;-20;0;20;20;0;1;-20;0;20;20;0;1;-20;0;20;20;0;1;-20;0;20;20;0;1;-20;0;20;20;0;1;22,0;0;75,7;0;-20;0;-20;0;-20;0;0;50;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;73,4;0;93150,2;100;3;3;3;0;1;6;0;0;0;0;0;0;0;0;0;2;0;10;3;0;0;0;50;0;0;49B;1000;7800;0;0;0;0;200;
27.12.2022 19:14;1;1,2;7,5;60,7;0;56,6;0;0;0;0;0;0;0;0;9;1;75;0;19;11;140;1000;57,0;58;-0,6;1,4;56,5;120;42,2;-20;-20;1;-1;0;0;0;0;3;0;0;0;0;60;2;0;107;50,5;0;100;0;0;13;120;26;-20;27,2;28;24;18;1;1;44,6;45;23,5;12,5;1;1;49,5;50;20;20;1;1;-20;0;20;20;0;1;-20;0;20;20;0;1;-20;0;20;20;0;1;-20;0;20;20;0;1;-20;0;20;20;0;1;21,7;0;75,7;0;-20;0;-20;0;-20;0;0;50;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;73,4;0;93150,2;100;3;3;3;0;1;6;0;0;0;0;0;0;0;0;0;2;0;10;3;0;0;0;50;0;0;49B;1000;7800;0;0;0;0;200;
27.12.2022 19:12;1;1,2;7,5;60,7;0;56,6;0;0;0;0;0;0;0;0;10;1;75;0;19;11;140;1000;57,0;58;-0,6;1,4;57,3;120;42,2;-20;-20;1;-1;0;0;0;0;3;0;0;0;0;61;2;0;107;50,5;0;100;0;0;13;120;26;-20;27,2;28;24;18;1;1;44,6;45;23,5;12,5;1;1;49,5;50;20;20;1;1;-20;0;20;20;0;1;-20;0;20;20;0;1;-20;0;20;20;0;1;-20;0;20;20;0;1;-20;0;20;20;0;1;21,7;0;76,0;0;-20;0;-20;0;-20;0;0;50;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;73,4;0;93150,2;100;3;3;3;0;1;6;0;0;0;0;0;0;0;0;0;2;0;10;3;0;0;0;50;0;0;49B;1000;7800;0;0;0;0;200;
27.12.2022 19:10;1;1,2;7,5;60,7;0;57,0;0;0;0;0;0;0;0;0;10;1;75;0;19;11;140;1000;57,0;58;-0,6;1,4;57,8;120;42,5;-20;-20;1;-1;0;0;0;0;3;0;0;0;0;62;2;0;107;50,5;0;100;0;0;13;120;26;-20;27,2;28;24;18;1;1;44,6;45;23,6;12,4;1;1;49,2;50;20;20;1;1;-20;0;20;20;0;1;-20;0;20;20;0;1;-20;0;20;20;0;1;-20;0;20;20;0;1;-20;0;20;20;0;1;21,7;0;76,0;0;-20;0;-20;0;-20;0;0;50;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;73,4;0;93150,2;100;3;3;3;0;1;6;0;0;0;0;0;0;0;0;0;2;0;10;3;0;0;0;50;0;0;49B;1000;7800;0;0;0;0;200;

nun kann es passieren das die telnet abfrage keine werte liefert und die Zeile wie im Beispiel nur Datum und Uhrzeit enthält. Nun möchte ich solche Zeilen automatisch finden und löschen lassen. Am besten mit dem gleichen sh-script.

wie wäre der Ansatz?
 

Technipion

Erfahrenes Mitglied
Wenn ich das richtig sehe, enthält die fehlerhafte Zeile kein Semikolon?
Dann wäre es ja relativ simpel: Du filterst Zeilen heraus, die kein Semikolon enthalten.
 

Technipion

Erfahrenes Mitglied
Eventuell wird ja doch nach der Uhrzeit ein Semikolon erstellt.
Im Zweifel suchst du halt nach Zeilen mit mind. 2 Semikolons.

Regex für 1 Semikolon: .*;
Regex für 3 Semikolons: (.*;){3}

(Der Punkt steht für irgendein beliebiges Zeichen (außer Zeilenumbruch). Der Stern bezieht sich auf den Punkt und bewirkt, dass dieser beliebig oft wiederholt werden kann. Das Semikolon steht für das Zeichen ";". Die runden Klammern machen aus .*; eine Gruppe. Die {3} bedeutet "3 Wiederholungen der vorigen Gruppe".)

Hier kannst du nachlesen, wie man damit filtert.

Gruß Technipion
 

Technipion

Erfahrenes Mitglied
In dem Fall würde ich daran denken, gleich an der Quelle anzusetzen und die aktuelle Zeile nur dann in die Datei einzufügen wenn Inhalt vorhanden ist.
Guter Punkt!
Ich gehe mal davon aus, dass er die Ausgabe des Befehls in einer Variablen speichert und irgendwo dann in die CSV-Datei schreibt. In dem Fall könnte man filtern, indem man nur ab einer bestimmten Stringlänge abspeichert :unsure:
 

cliodriver

Mitglied
hier noch das script zum erstellen. der code ist nicht auf meinem Mist gewachsen, ich habe ihn nur an meine Bedürfnisse angepasst

Code:
!/bin/bash
# shellscript zur Loggen von Telnet Daten einer Hargasser ECO HK40 Baujahr 2015
# die daten werden in einer Excel conformen CSV Datei gespeichert
#
while true; do
#
# Das akutelle Datum umd Zeit wird in eine Datei geschrieben
#
date +%d.%m.%Y" "%H:%M > /home/server/hargassner/Date.log
#
# 10 Sekunden wird an Telnet gelauscht und in eine Datei geschrieben
#
timeout 10 nc 192.168.1.25 23 > /home/server/hargassner/Temp.log
#
# Für eine Weitervearbeitung in Excel werden nun Punkte durch Komma ersetzt
#
sed -i 's/\./,/g' /home/server/hargassner/Temp.log
#
#das "pm" am Anfang der Zeile entfernen
#
sed -i 's/\pm //g' /home/server/hargassner/Temp.log
#
# Um eine Excel csv Datei zu erstellen werden nun Leerzeichen durch Semikolon ersetzt
#
sed -i 's/ /;/g' /home/server/hargassner/Temp.log
#
#auf 600 Zeichen kürzen
#
sed -i -r 's/(.{600}).*/\1/;q' /home/server/hargassner/Temp.log
#
# Nun wird an die Datumsdatei die Temp Datein mit der Aufzeichungszeile angehängt
#
cat /home/server/hargassner/Temp.log >> /home/server/hargassner/Date.log
#
# Die Datumsdatei mit Datumsangabe und Aufzeichnungszeile wird nun
# auf die die "alte" Temp Datei kopiert und dabei überschrieben
#
mv /home/server/hargassner/Date.log /home/server/hargassner/Temp.log
#
# Nun wird der Zeilenumbruch aus der Datei entfernt und durch ein Simekolon ersetzt
#
sed -i ':a;N;$!ba;s/\n/;/g' /home/server/hargassner/Temp.log
#
# Da das aktuelle Datum immer zu oberst sei soll, wird nun die die schon bestehende
# cvs Datei an die Temp Datein angehängt
#
cat /home/server/hargassner/hargassner.csv >> /home/server/hargassner/Temp.log
#
# Die Temp Datei wieder auf die "alte" csv Datei kopieren
#
mv /home/server/hargassner/Temp.log /home/server/hargassner/hargassner.csv
#
# Damit die Log Datei nicht undendlich Gross wird
# wird nun die Datei durch kopieren der ersten 10000 Zeilen
# und schreiben in Temp Datei, die Aufzeichnungslänge eingekürzt
#
sed -ne '1,10000p'  /home/server/hargassner/hargassner.csv > /home/server/hargassner/Temp.log
#
# Zurückschreiben der Temp Datei in die csv datei
#
mv /home/server/hargassner/Temp.log /home/server/hargassner/hargassner.csv
#
cp -R /home/server/hargassner /mnt/c/Web/Apache24/htdocs/csvlog
sleep 2m
done
 
Zuletzt bearbeitet:

Sempervivum

Erfahrenes Mitglied
Bash ist lange her bei mir aber ich habe mal hier nachgelesen:
How to check if a file is empty in Bash?
Demnach müsste dies ausreichend sein:
Code:
!/bin/bash
# shellscript zur Loggen von Telnet Daten einer Hargasser ECO HK40 Baujahr 2015
# die daten werden in einer Excel conformen CSV Datei gespeichert
#
while true; do
#
# Das akutelle Datum umd Zeit wird in eine Datei geschrieben
#
date +%d.%m.%Y" "%H:%M > /home/server/hargassner/Date.log
#
# 10 Sekunden wird an Telnet gelauscht und in eine Datei geschrieben
#
timeout 10 nc 192.168.1.25 23 > /home/server/hargassner/Temp.log
#
# Ist die Ausgabe von Telnet leer, ignorieren wir sie
#
[ -s /home/server/hargassner/Temp.log ] || continue
#
# Für eine Weitervearbeitung in Excel werden nun Punkte durch Komma ersetzt
#
sed -i 's/\./,/g' /home/server/hargassner/Temp.log
#
# usw. wie vorhanden

Das setzt voraus, dass die Ausgabe vollständig leer ist. Ist das nicht der Fall, die Lösung von Noam Manos mit grep verwenden, dann kannst Du auf ein beliebiges Muster prüfen.
 

cliodriver

Mitglied
leider läuft das script mit dieser Änderung nicht

hier noch die Info wie das script ausgeführt wird:

Ich betreibe dies auf einen Win 10 Server der das script im WSL ausführt. Mittels Aufgabenplanung wird WSL/Script gestartet (einmalig beim Start vom Server) und läuft dann eigentlich dauerhaft mit den 2 Minuten Pause nach jedem Durchlauf
Code:
sleep 2m

ist der Host beim Abrufen zufällig nicht erreichbar läuft das script leer durch und es entsteht eine leere Zeile.

mir wäre am liebsten ich könnte auch auf WSL verzichten aber ich habs nur so hinbekommen