Pipe-Ausgabe vom Programm in eine dynamische, benannte Datei (enthält Datum)

426
poor_red_neck

Ich bin immer noch ein Neuling in der Flaschenfütterung, also geh einfach. Ich habe mich so weit gegoogelt, aber ich finde keine Antwort.

Ich führe ein Programm aus, das CSV-Daten ausgibt, und leitet es an log.csv weiter

Ich bin auf der Suche nach einer Möglichkeit, die Pipe-Ausgabe mit dem Datum und der Uhrzeit zu versehen, an dem sie erstellt wurde.

Im Moment sieht der Befehl so aus (von Hand jeden Morgen gedrückt, noch kein Crontab, bis ich das funktioniere)

rtlamr -format=csv -msgtype=scm | tee /home/jonboy545/energy/logs/3-16-18_7_30.csv 

Ich verwende, | teedamit ich die Ausgabe weiterhin auf dem Terminal sehen und die Datei protokollieren kann.

Wie kann ich also die Ausgabe an einen dynamischen Dateinamen weiterleiten? Ich habe ein einfaches Bash-Skript, das Text ausgeben wird, aber wie kann ich rtlamr mit | ein Bash-Skript zum Generieren eines Dateinamens?

Hier ist das Skript namens "log_energy.sh", um den Namen der Textdatei zu erstellen:

#!/bin/bash today=`date '+%m_%d__%H_%M_%S'`; filename="/home/jonboy545/energy/logs/$today.csv" echo $filename; 

Wenn Sie ausführen, wird ./log_energy.shder Text wie erwartet ausgegeben:

/home/jonboy545/energy/logs/03_16__17_30_39.csv 

Also mein dummes Denken ist so etwas (was offensichtlich nicht funktioniert)

rtlamr -format=csv -msgtype=scm | tee /home/jonboy545/./log_energy.sh 

Jetzt, wo ich darüber nachdenke, kann es einfacher sein, einfach ein Skript zu erstellen, das all das erledigt. Also so etwas?

#!/bin/bash today=`date '+%m_%d__%H_%M_%S'`; filename="/home/jonboy545/energy/logs/$today.txt" /usr/bin/rtlamr -format=csv -msgtype=scm | tee $filename; 

Ich denke, ich habe vielleicht gerade meinen eigenen Beitrag beantwortet, aber ich bin mir sicher, dass das obige Skript etwas falsch gemacht hat.

1
Sie könnten Ihre Frage so viel einfacher machen, wenn Sie einen einfacheren Befehl als rtlamr verwenden. Wie ein Befehl, mit dem die Leute vertraut sind, wird er für Ihre Frage nativ installiert. barlop vor 6 Jahren 0
try $ (\ `./script \`) Oder Sie möchten vielleicht einen Befehl ausführen und die Ausgabe dieses Befehls in einer Variablen abrufen. Verwenden Sie diese Variable, also a = $ (\ `./ abc.sh \ `) Dann benutze $ a barlop vor 6 Jahren 0
Es ist also nicht klar, wo die Dinge stehen und was Ihre Frage derzeit ist. Wenn Sie nicht sicher sind, ob Ihre Lösung funktioniert, testen Sie sie. Wenn dies nicht funktioniert, konzentrieren Sie sich auf dieses Problem. Wenn es funktioniert, verschieben Sie Ihre Lösung auf eine Antwort. fixer1234 vor 6 Jahren 0
@ fixer1234 seine Frage ist mir klar. Wenn Ihnen das nicht klar ist, sollten Sie ihn fragen, was Sie nicht verstehen, sonst ist es absurd. barlop vor 6 Jahren 0
`| tee / home / jonboy545 / $ a` Stellen Sie dann sicher, dass $ a den gewünschten Dateinamen hat. Durch Ausführen von $ a = $ (\ `abc.sh \`) barlop vor 6 Jahren 0
@ barlop Ich denke nicht, dass das fragliche Programm, das ausgegeben wird, von Bedeutung ist. Es ist eine Pipe-Ausgabe. Es könnte ls sein tee directory.txt, wenn Sie es so sehen wollen. Wichtig ist nur, was nach der Pfeife passiert. Das begreife ich nicht. poor_red_neck vor 6 Jahren 0
@barlop, die Frage beginnt mit der Frage, wie eine Aufgabe auszuführen ist. Dann gibt es an, was angeblich eine Lösung ist, und wirft eine Art neue Frage auf - einen Zweifel, ob die Lösung funktioniert, die getestet werden kann. Wenn die Lösung fehlschlägt, handelt es sich lediglich um "das ist, was ich erfolglos versucht habe". Wenn es funktioniert, sollte es zu einer Antwort verschoben werden. Ein neuer Kommentar des OP fügt zusätzliche Klarstellungen hinzu, jedoch nicht in der Frage, wo der Inhalt der Frage stehen muss. In meinem vorherigen Kommentar wurde das genau beschrieben und beschrieben, was nötig war. Es ist nicht klar, was Sie damit nicht verstehen. fixer1234 vor 6 Jahren 0
Ich denke, ich bin nicht auf dem neuesten Stand, wie spezifisch, wählerisch, wie auch immer Sie es nennen wollen, die Leute auf dieser Seite. Extrem streng in der Strukturierung aller Fragen, Beschreibungen usw. Ich verstehe es .... Sie wollen Konsistenz oder was haben Sie, aber ich glaube nicht, dass ich zu weit von der Basis entfernt bin. Vielleicht ein bisschen TL; DR geht weiter ... Da Linux so viele Akronyme und extrem abgekürzte Befehle usw. enthält, wollen Sie einfach alles direkt und auf den Punkt bringen. Keine Fähigkeit, die dieser Südländer gut kann ;-) poor_red_neck vor 6 Jahren 0
@poor_red_neck, die Site ist eine Wissensdatenbank mit Lösungen, die von anderen Personen mit ähnlichen Problemen gemeinsam genutzt werden können. Hoffentlich erhalten Sie eine Antwort auf Ihr Problem, aber Sie senden auch eine Frage an die Bibliothek, die andere Personen bei der Suche finden können. Dies hängt von einem Q & A-Format ab, in dem sich alle Frageninformationen im Fragenpost befinden und Lösungen in Antwortposten sind. Die Informationen sind leichter zu finden, wenn alles konzentriert ist und auf den Punkt kommt, ohne etwas, das für die nächste Person mit einem ähnlichen Problem nicht relevant ist. (weiter) fixer1234 vor 6 Jahren 0
In der Hilfe finden Sie viele Ratschläge, indem Sie auf das Fragezeichen in der oberen Leiste klicken. BTW, willkommen auf der Website. fixer1234 vor 6 Jahren 0

2 Antworten auf die Frage

0
poor_red_neck

Ich glaube, ich habe meine eigene Frage beantwortet, oder besser gesagt, ich habe sie zum Laufen gebracht ... hatte den Programmplatz falsch, aber das ist nur Semantik.

log_energy.sh:

#!/bin/bash today=`date '+%m_%d__%H_%M_%S'`; filename="/home/jonboy545/energy/logs/$today.txt" /home/jonboy545/GoCode/bin/rtlamr -format=plain -msgtype=scm | tee $filename; 

Das führt zu den erwarteten Ergebnissen. Wenn ich ./log_energy.sh starte, erhalte ich die Terminalausgabe auf dem Bildschirm und der Dateiname wird mit dem Datum erstellt.

Jetzt los um Crontabs zu lernen! Insbesondere, wie ein Skript zu einem bestimmten Zeitpunkt abläuft und dann erneut beginnt. Mehr googeln !!!!

Vielen Dank für die Hilfe, vielleicht wird jemand darauf stoßen, da ich schwöre, dass ich den Scheiß gegoogelt habe und keine Antwort gefunden habe, aber jetzt sehe ich, dass ich darüber nachgedacht habe.

Ich habe jetzt ein Problem mit dieser "Lösung". Wenn ich mir die csv-Dateien anschaue, sind sie alle "Lese- / Schreibgeschützt" und sagen, dass sie im Besitz von root sind. Werden unter crontab ausgeführte Skripte als root ausgeführt? poor_red_neck vor 6 Jahren 0
Nun, man kann diese Dinge immer ändern, zB csvs chmod 666 erstellen (damit jeder lesen / schreiben kann), aber hilft das? https://askubuntu.com/questions/419548/wie-nach-set-up-a-root-cron-job-properly barlop vor 6 Jahren 0
Ja, aber vor allem, weil ich so gesehen habe, wie unwissend ich wirklich bin. Hinweis an sich selbst: Wenn Sie Crontab als Sudo ausführen, wird die Crontab-Datei von Root bearbeitet. Duh. Bearbeiten Sie einfach crontab als Benutzer ... Problem gelöst. Habe crontab -u jonboy545 -e und das war natürlich der richtige Crontab, den man in erster Linie bearbeiten konnte ... poor_red_neck vor 6 Jahren 0
Repliziert systemd nicht viel von dem, was cron kann? Xen2050 vor 6 Jahren 0
Vielleicht, hatte aber keine Ahnung, was das war, bis ich deinen Kommentar sah. Ich habe den Crontab jeden Tag um Mitternacht laufen lassen und er führt ein Skript aus. Das Skript führt einen Pkill des aktuell laufenden Programms aus, es wurde später am Tag von einem Absturz oder etwas ausgeführt und führt dann das Programm rtlamr für eine Dauer von 23h59m55s aus. Wenn das Crontab erneut läuft, sollte es keine Instanz von pkill geben, aber es ist nur noch nicht vorhanden. Dann macht es alles noch einmal. So weit, ist es gut! poor_red_neck vor 6 Jahren 0
0
Xen2050

Sie verwenden bash, sodass Sie die Prozess- und Befehlsersetzung verwenden können .

Von dem Titel, von dem ich dachte, dass Sie vielleicht das Datum an den Anfang der Ausgabe der Protokolldatei anfügen möchten, würde dies etwa so aussehen:

$ program |while read pong; do echo $pong; echo $(date):\ $pong >> logfile; done 

Oder das Hinzufügen des Datums zum Dateinamen würde zu umleiten >> "$(date)-logfile"

Aber es sieht so aus, als würden Sie den Dateinamen nur mit tee verwenden:

rtlamr -format=csv -msgtype=scm | tee "$(date '+%m_%d__%H_%M_%S')" 

Wenn Sie als Benutzer ausgeführt werden, sollte die Datei genau wie jede andere von Ihrem Benutzer erstellte Datei sein.

Ah, ich mag die zweite Option, aber letztendlich funktionierte ein bash-Skript besser, da das bash-Skript es mir erlaubt, ein paar zusätzliche Befehle in das Kommando einzufügen. Vielen Dank, da ich nicht wusste, dass Sie "dynamische" Daten in ein | einfügen können Abschlag ausgeben! Ich werde diese als beste Antwort auswählen, da sie die Frage direkt beantwortet. poor_red_neck vor 6 Jahren 0
Willkommen und vielen Dank :) Die große Manpage von Bash geht kurz auf viele Funktionen ein, aber die Suche nach einem zu lösenden Problem ist auch gut. Zitate und die Reihenfolge der Dinge können etwas haarig werden, besonders bei lustigen Charakteren wie Leerzeichen, Zeilenumbrüchen, Nullen ... Xen2050 vor 6 Jahren 0