Ich möchte also ein wenig protokollieren und dafür ein Datum vor die Ausgabe eines Bash-Skripts setzen. Das Problem ist, dass es mehrere Ausgabezeilen gibt. Ich kann nur das Datum vor die gesamte Ausgabe setzen. Aber dann habe ich eine Zeile ohne Datum in den Protokollen. Natürlich kann ich davon ausgehen, dass das Datum in der obigen Zeile das gleiche ist, aber ich hatte gehofft, dass es eine Lösung gibt. Danke im Voraus!
Dies ist mein Skript, das ein anderes Skript aufruft:
#!/bin/sh
echo $(date "+%F %T") : starting script
echo $(date "+%F %T") : $(./script.sh)
echo $(date "+%F %T") :script ended
Dies ist die Ausgabe:
2012-07-26 15:34:12 : starting script
2012-07-26 15:35:14 : First line of output
second line of output
2012-07-26 15:35:17 : script ended
Und das hätte ich gerne:
2012-07-26 15:34:12 : starting script
2012-07-26 15:35:14 : First line of output
2012-07-26 15:35:15 : second line of output
2012-07-26 15:35:17 : script ended
Antworten:
Laut einer ähnlichen Frage zu Stack Overflow gibt es zwei großartige Optionen.
awk ( Antwort )
kommentieren ( Antwort )
annotate ist ein kleines Bash-Skript, das entweder direkt über den hier angegebenen Link oder auf Debian-basierten Systemen über das Paket
devscripts
(in Form vonannotate-output
) abgerufen werden kann .quelle
Ich denke, dass Sie awk dafür verwenden können:
( Informationen zum Formatieren des von strftime () zurückgegebenen Datums finden Sie unter http://www.gnu.org/software/gawk/manual/html_node/Time-Functions.html. )
quelle
awk: calling undefined function strftime
- Ist das spezifisch fürgawk
?Sie können verwenden
awk
awk
Nimmt einen Eingabestream und ändert seine Ausgabe. Dieses Skript sagt "print d gefolgt von der Originalausgabe" und füllt dannd
mit dem Datum.quelle
date
Ausdruck nicht auch nur einmal aus, so dass alle diese Zeilen zur gleichen Zeit gedruckt werden?Dies wird das aktuelle Datum und die aktuelle Uhrzeit vor jeder Ausgabezeile von
./script.sh
:Wie es funktioniert
set -f
Deaktiviert die Bash-Erweiterung (oderecho *
druckt keinen Stern).while read -r LINE; do ... done
Speichert eine Ausgabezeile in der Variablen$LINE
und wird ausgeführt...
, bis alle Zeilen verarbeitet wurden.echo $ (Datum "+% F% T"): "$ LINE" druckt die Zeile mit der aktuellen Uhrzeit und dem aktuellen Datum.
set +f
Schaltet die Bash-Erweiterung wieder ein, damit der Rest Ihres Bash-Skripts nicht beeinträchtigt wird.quelle
sed
fügt jeder das gleiche Datum ein, unmittelbar bevor das zweite Skript gestartet wird. Wahrscheinlich nicht das, was der Benutzer will ...ls
. Probieren Sie Ihr Skript einfach mit folgendem Code ausscript.sh
:#!/bin/bash
(newline)echo 1 ; sleep 1 ; echo 2 ; sleep 2 ; echo 3 ; sleep 3 ; echo 4
read
mit einerwhile
Schleife anstelle einer for-Schleife.