Variablen in einer Log-Datei sollen exakt untereinander stehen

chats

Benutzer
Registriert
29. Sep. 2012
Beiträge
577
Reaktionspunkte
12
Punkte
38
Hallo zusammen,
ich bin an einer Logdatei zugange wo ich Variablen reinschreibe.

05-03-25 09-15-01 1741162501 1741162511 10 10.0 Watt/std 80
05-03-25 08-35-01 1741160101 1741160111 10 8.11 Watt/std 64.88

Hier kann man erkennen das die Werte nicht exakt untereinander stehen. Die Informationen selber stimmen und es ist für mich nur eine Kür die LogDatei schön zu machen.
Also hätte ich hätte die Werte gerne untereinander stehen.
Die erste Hürde wird wohl sein das manchmal ein Punkt vorhanden ist und manchmal eine oder zwei stellen vor dem Punkt bzw. Komma.
Vielleicht kann da mal jemand was zu schreiben.
Wie geschrieben nur die Kür, mehr nicht.

Edit: Ich habe den Post abgeschickt und da steht es untereinander. Aber in der Logdatei selber nicht.
 
Edit: Ich habe den Post abgeschickt und da steht es untereinander. Aber in der Logdatei selber nicht
Dann stehen da wohl Tabs die mit deinem Anzeigetool nicht expandiert werden. Mit dem Tool
Code:
expand
kannst Du Tabs durch Spaces ersetzen und dann sollte alles passen.
 
  • Like
Reaktionen: DaveR
Du schreibst nicht, wie Du die Daten in die Log-Datei reinschreibst. Sofern Du das mit einem Shell-Skript machst, kannst Du das Kommando printf (in einem bash-Skript) nutzen, um die Ausgabe zu formatieren.

Hier ein Beispiel - das kleine Skript:
Bash:
#!/bin/bash

printf "Ersatzteil fuer: %-10s Preis: %8.2f\n" "Trabi" ".99"
printf "Ersatzteil fuer: %-10s Preis: %8.2f\n" "VW" "12.34"
printf "Ersatzteil fuer: %-10s Preis: %8.2f\n" "Mercedes" "1234.98"
ergibt folgende formatierte Ausgabe:
Bash:
Ersatzteil fuer: Trabi      Preis:     0.99
Ersatzteil fuer: VW         Preis:    12.34
Ersatzteil fuer: Mercedes   Preis:  1234.98
Im ersten String gibst Du Text und Formatanweisungen an, mit denen die beiden nachfolgenden Strings ausgegeben werden (Hinweis: die Anzahl der Strings nach dem ersten muss mit der Zahl der Formatanweisungen im ersten String übereinstimmen):
  • "%-10s": gibt den zweiten String (hier den Autonamen) 10-stellig, linksbündig aus. Willst Du den String rechtsbündig ausgeben, dann lautet die Formatanweisung "%10s".
  • "%8.2f" gibt den dritten String (hier den Preis) als 8-stellige Fließkommazahl mit 2 Dezimalstellen rechtsbündig aus.
  • "\n" wird für den Zeilenvorschub benötigt.
Statt der Strings aus dem Beispiel kannst Du selbstverständlich auch Variablen verwenden, die Du ausgeben möchtest. Einfach ausprobieren und ein wenig rumspielen bis es passt.

Weitergehende Infos zu printf gibt es auf zahlreichen Seiten im Netz, wie z.B. hier: Klick mich.
 
Zuletzt bearbeitet:
  • Like
Reaktionen: DaveR
Etwas trivialer aber dafür ohne formatireung mit echo -e möglich. Als Tab einfach \t verwenden.
Bash:
echo -e "05-03-25\t09-15-01\t1741162501\t1741162511\t10\t10.0\tWatt/std\t80"
echo -e "05-03-25\t08-35-01\t1741160101\t1741160111\t10\t8.11\tWatt/std\t64.88"

Ergibt:
Code:
05-03-25        09-15-01        1741162501      1741162511      10      10.0    Watt/std        80
05-03-25        08-35-01        1741160101      1741160111      10      8.11    Watt/std        64.88
 
Ja, damit erreichst Du, dass in jeder ausgegebenen Zeile jede Spalte an der gleichen Position beginnt.

Allerdings hat Deine Lösung zwei Nachteile: Zum einen ist die Angabe der Einheit "Watt/Std" bei Spalte 6 recht weit weg von den Werten, und zum anderen werden in Spalte 6 und 7 die Dezimalstellen nicht wie vom TE gewünscht ausgegeben, sprich die Werte der Fließkommazahlen sind nicht ausgerichtet. Außerdem, aber das ist nur mein rein persönlicher Geschmack, mag ich keine Steuerzeichen (so auch Tabs) in Logdateien, denn es kann es bei einer möglichen Weiterverarbeitung zu Problemen kommen. Aber darüber streiten sich bereits Generationen von Entwicklern... :cool:

Wenn die Ausgabe der Daten für das Logfile in einem Skript erfolgt, das die Variablen $col1 bis $col7 nutzt, dann könnte das printf-Kommando z.B. wie folgt aussehen
Bash:
printf "%8s %8s %10d %10d %2d %5.2f Watt/Std %5.2f\n" $col1 $col2 $col3 $col4 $col5 $col6 $col7
und folgende Ausgabe erzeugen:
Code:
05-03-25 09-15-01 1741162501 1741162511 10 10.00 Watt/Std 80.00
05-03-25 08-35-01 1741160101 1741160111 10  8.11 Watt/Std 64.88
05-03-25 07-35-01 1741160657 1741160849 10  0.11 Watt/Std  4.45
Und so habe ich den TE verstanden, möchte er es gerne haben.
 
  • Like
Reaktionen: luddi und DaveR
Absolut richtig und ich stimme dem zu. Dass deine Lösung die elegantere ist will ich überhaupt nicht bestreiten. Das war nie das Thema und soll es auch nicht werden. Ich sprach in meinem Vorschlag auch von trivial.
Es ist einfach eine schneller und pragmatischer Ansatz um das Log in einem besser menschlich lesbaren Format zu erhalten.
Ich weiß jegliche Meining zu schätzen und befürworte auch gern die saubere Lösung bzw. Umsetzung.
Meistens folge ich jedoch gerne dem Paretoprinzip um Ergebnisse zu erzielen.
 
  • Like
Reaktionen: Annika Hansen
@Annika Hansen
In der Spalte 05-03-25 09-15-01 bezieht sich Deine Lösung auf zwei Variablen.
Nämlich 05-03-25 UND 09-15-01
Es ist jedoch nur EINE Variable mit einem Leerzeichen dazwischen. ( date +%d-%m-%y" "%H-%M-%S )
Da scheitere ich zur Zeit dran. Oder ich muss die Variable zerlegen in Tag und Uhrzeit.
 
Es ist jedoch nur EINE Variable mit einem Leerzeichen dazwischen. ( date +%d-%m-%y" "%H-%M-%S )
Oder ich muss die Variable zerlegen in Tag und Uhrzeit.
Ja genau, ist am einfachsten.

Bash:
datum=$(date +%d-%m-%y)
zeit=$(date +%H-%M-%S)
printf "%8s %8s\n" $datum $zeit

Oder ohne Zwischenvariablen einfach direkt an printf übergeben.
Bash:
printf "%8s %8s\n" $(date +%d-%m-%y) $(date +%H-%M-%S)
 
Zuletzt bearbeitet:
  • Like
Reaktionen: DaveR
In der Spalte 05-03-25 09-15-01 bezieht sich Deine Lösung auf zwei Variablen.
Nämlich 05-03-25 UND 09-15-01
Es ist jedoch nur EINE Variable mit einem Leerzeichen dazwischen.
Da Du nicht geschrieben hattest, woher die Daten für die Logdateien kommen, musste ich eine Annahme treffen, nämlich dass die Spalten 1 und 2 in zwei verschiedenen Vartiablen enthalten sind.

Wenn Du also das Datum im Skript selbst erzeugst, dann ist der Ansatz, den @luddi geschrieben hat, der korrekte Weg. Da das date-Kommando bereits das Ausgabeformat für Datum/Uhrzeit beschreibt, ist keine zusätzliche Formatierung über das printf-Kommando erforderlich. In dem Fall würde das Kommando dann in etwa so aussehen:
Bash:
printf "$(date '+%d-%m-%y %H-%M-%S') %10d %10d %2d %5.2f Watt/Std %5.2f\n" $col1 $col2 $col3 $col4 $col5
Hinweis: Sollte bei einem printf-Kommando eine der Variablen ein String sein, der Leerzeichen enthalten kann, dann solltest Du die Variablen $col1 bis $colx in doppelte Anführungszeichen setzen. Das ist aber nach dem, was ich verstanden habe, bei Deinen Daten nicht der Fall.
 
Zuletzt bearbeitet:
  • Like
Reaktionen: DaveR
Sorry für die späte Antwort.
Ich habe das soweit ausprobiert und es klappt auch.
Eine Frage habe ich dennoch...
Ist es möglich die Variablen an eine bestimmte Spalte zu schreiben.

Beispiel:
Zeile1 Spalte1 soll die erste Variable stehen, Zeile 1 Spalte 15 soll die zweite Variable stehen, Zeile1 Spalte 25 soll die dritte Variable stehen.
Die Spalten können ruhig feste stehen da die immer den gleichen Platz einnehmen.
 
Ich hab bezüglich printf noch eine Frage.
Ich habe die Variablen welche vom Inhalt her stimmt.
Zum Beispiel a=3.14
Da diese 3.14 aber keine Zahl ist sondern ein Textstring kommt die Fehlermeldung:
printf: 3.14: invalid number
Kann printf mit Textvariablen nicht umgehen?
Muss die Variable zwingend eine Zahl enthalten?
 
Kann man auch 2 Ausgabefunktionen verknüpfen?
zum Beispiel %5.2f UND %5.2d
so das der Wert auf 2 Nachkommastellen abgeschnitten wird aber auch gleichzeitig rechtsbündig eingefügt wird?
 
Is it possible to assign variables to a specific column?
You can print the variables in whatever order you want. Like $col1 $col15 $col25

Assigning a=3.14 is a string, not a integer or floating point number.

The 5 in %5.2d means pad to 5 spaces.
The 2 in %5.2d means pad to 2 decimal places.
The d at the end of %5.2d means format as a decimal.
The f at the end of %5.2f means format as a floating point integer. You can't as both f and d at the same time.

Have a look at https://linuxize.com/post/bash-printf-command/
 
@DaveR Well, now i am one step further. When i use vi the result is exact that what i want.
The file is saved as an .txt document. When i open the file with a windows app it ist not that what i want.
Each editor has different results. Maybe i have to use another font.
Even notepad ++ shows me different results.
now i will try some settings in notepad++
 
Notepad++ kann eigentich mit allen üblichen Zeilenende-Formaten umgehen: Windows (CR-LF), macOS (CR), Unix (LF), warum schlägst Du das vor?

@chats Für die korrekte Darstellung musst Du vermutlich einen Konsolen-Font wählen, bei dem alle Zeichen die gleiche Breite haben. Dann sollten deine Texte auch sauber übereinander stehen. Andererseits ist das irgendwie 90er-Jahre-Stil. Schon mal darüber nachgedacht, die einzelnen Felder mit einem Komma oder Semikolon voneinander zu trennen und dann einfach als CSV- statt TXT-Datei zu speichern? Dann kannst Du sie nämlich einfach mit Excel oder LibreOffice als Tabelle öffnen.
Wichtig ist, dass das Trennzeichen (Komma, Semikolon, Tabulator) nicht in den eigentlichen Nutzdaten auftaucht (das würde auch gehen, aber dann muss man alle Felder zusätzlich in Anführungszeichen stellen und macht die Sache komplizierter). Einfach mal bei Wikipedia schauen, ob Dir das besser gefallen würde: https://de.wikipedia.org/wiki/CSV_(Dateiformat)
 
Es ist wirklich immer wieder spannend zu beobachten, wie manche Menschen (hier im Forum) Hilfe in Anspruch nehmen, als wäre es das Normalste der Welt, und dann mit keinem einzigen Wort der Anerkennung reagieren. :rolleyes: Es ist fast so, als ob das eigene Wissen und die Zeit, die man investiert, um zu helfen, keinerlei Wert haben.

Aber hey, keine Sorge, wir sind ja alle nur Menschen und erwarten nichts im Gegenzug, außer vielleicht mal ein kleines 'Danke'.
 
  • Like
Reaktionen: luddi und JohneDoe

Additional post fields

 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat