Beim Versuch,Datum in der Bash-Shell konvertieren, Ich habe es versuchtCoprocessing-Funktion von GNU awk:
gawk -F, -v cmd='date +"%Y-%m-%d %H:%M:%S" -f-' '{print $5 |& cmd; cmd |& getline d; $5 = d}1' foo
Dieser Befehl hängt. Ich dachte, das könnte daran liegen, dass date
er darauf wartet, die gesamte Eingabe zu lesen, also habe ich versucht, die sendende Hälfte der Pipeline zu schließen:
gawk -F, -v cmd='date +"%Y-%m-%d %H:%M:%S" -f-' '{print $5 |& cmd; close(cmd, "to"); cmd |& getline d; $5 = d}1' foo
Das funktioniert (ja, ich weiß, ich sollte es einstellen OFS=,
, aber im Moment …).
Es scheint jedoch date
kein Problem zu geben, die Eingaben zu verarbeiten, wenn sie eingehen. Dadurch wird sofort die erste Ausgabezeile angezeigt:
d='Thu Apr 27 2017 23:19:47 GMT+0700 (ICT)'
(echo "$d"; sleep 1m; echo "$d") |
date +"%Y-%m-%d %H:%M:%S" -f-
Was ist los?
Antwort1
Wie bei vielen anderen Programmen date
wird die Ausgabe von gepuffert, wenn stdout kein tty ist. Wenn Sie es über aufrufen, stdbuf -oL
wird die Ausgabe in jeder Zeile geleert, und Ihr erster Gawk-Beispielcode funktioniert einfach (das Schreibende der Pipe muss nicht geschlossen werden).