Ich lese gerade dieGNU Coreutils-Handbuch, und ich experimentiere mit dem date
Befehl. Folgendes habe ich im Text gefunden:
Der
date
Befehl hat eine Option:-f datefile
- Analysieren Sie jede Zeile inDatumsdateiwie bei
-d
und zeigen Sie das resultierende Datum und die Uhrzeit an. - das heißt
date
, jede Zeile inDatumsdatei und behandeln Sie es als Datumszeichenfolge zur Anzeige eines bestimmten Datums.
- Analysieren Sie jede Zeile inDatumsdateiwie bei
InKapitel 29 (Datumseingabeformate), es ist angegeben:
Die Ausgabe des
date
Befehls ist nicht immer als Datumszeichenfolge akzeptabel, nicht nur aufgrund des Sprachproblems, sondern auch, weil es für Zeitzonenelemente wie „IST“ keine Standardbedeutung gibt. Bei der Verwendungdate
zur Generierung einer Datumszeichenfolge, die später analysiert werden sollein Datumsformat angeben, das sprachunabhängig ist und keine anderen Zeitzonenelemente als „UTC“ und „Z“ verwendet. Hier sind einige Möglichkeiten, dies zu tun:$ LC_ALL=C TZ=UTC0 date ︙
- Diese Aussage (vor allem der fettgedruckte Teil) impliziert für mich, dass ich in der Lage sein sollte, Datumsdateiein
date
Befehl wie der oben genannte, und derdate
Befehl, den ich im Terminal ausgebe, sollte in der Lage sein, diesendate
Befehl in derDatumsdatei und geben Sie das entsprechende Datum aus.
- Diese Aussage (vor allem der fettgedruckte Teil) impliziert für mich, dass ich in der Lage sein sollte, Datumsdateiein
Bei mir funktioniert es nicht. Entweder stimmt etwas mit meinem Datumsbefehl in der Datumsdatei nicht (falsche Anführungszeichen, eine spezielle Syntax, die ich nicht kenne ...), oder die -f datefile
Option kann mit dieser Situation nicht umgehen.
Zusammengefasst frage ich:
- Kann dem
date -f
Befehl eine Datei zugeführt werden, bei der die Datumszeichenfolge in einer Zeile ein weiterer Datumsbefehl ist? Kann ich beispielsweise in die erste Zeile einer Datei die Zeichenfolge „date“ einfügen (die als Befehl die Systemzeit zurückgeben würde) und diese Datei dann in einendate -f
Befehl einspeisen und die aktuelle Systemzeit abrufen (die durch dendate
Befehl in der Datei generiert wird)?
Antwort1
Das richtige Format für eine Datums-/Uhrzeitangabe, das von GNU Date korrekt analysiert wird, lautet:
$ LC_ALL=C TZ=UTC0 date +"%Y-%m-%dT%H:%M:%S%z"
2016-09-28T04:08:55+0000
Außerdem werden dadurch Leerzeichen vermieden, die andere Probleme verursachen können.
Wenn Ihre Datei eine Zeile pro Datum enthält, wie:
$ cat dates.txt
1992-03-28T14:26:01+0000
2004-02-29T21:02:02+0000
2005-02-28T21:02:03+0000
2015-07-02T11:52:04+0000
2016-03-31T01:36:05+0000
Dann klappt es:
$ TZ=America/Los_Angeles date -f infile
Sat Mar 28 06:26:01 PST 1992
Sun Feb 29 13:02:02 PST 2004
Mon Feb 28 13:02:03 PST 2005
Thu Jul 2 04:52:04 PDT 2015
Wed Mar 30 18:36:05 PDT 2016
Wenn Sie eine Datei mit „Datumsbefehlen“ wie folgt erstellen möchten:
$ cat dates.txt
date -d "1992-03-28T14:26:01+0000"
date -d "2004-02-29T21:02:02+0000"
LC_ALL=C TZ=UTC0 date -d "2005-02-28T21:02:03+0000" +"%Y-%m-%d"
TZ=America/Los_Angeles date -d "2005-02-28T21:02:03+0000"
date -d "2015-07-02T11:52:04+0000"
date -d "2016-03-31T01:36:05+0000"
Anschließend müssen Sie jede Zeile mit der Shell ausführen.
Eine schnelle Lösung besteht darin, die Datei als Quelle zu verwenden, und alle Befehle werden ausgeführt.
$ . ./dates.txt
Sat Mar 28 14:26:01 GMT 1992
Sun Feb 29 21:02:02 GMT 2004
2005-02-28
Mon Feb 28 13:02:03 PST 2005
Thu Jul 2 11:52:04 GMT 2015
Thu Mar 31 01:36:05 GMT 2016
Beantwortet das deine Frage?
Antwort2
Mit date
ab coreutils 8.21, TZ=UTC und LC_ALL=CI erhalten
$ date > x; sleep 1; date >> x; sleep 1; date >> x
$ date -f x
Wed Sep 28 03:32:39 UTC 2016
Wed Sep 28 03:32:40 UTC 2016
Wed Sep 28 03:32:41 UTC 2016
$
wie erwartet. Ich habe auch den Quellcode überprüft: Die Magie geschieht in der Routine, wo im Wesentlichen eine Schleife über / batch_convert
stattfindet , genau wie im Fall der Befehlszeile (mit ).parse_datetime()
show_date()
-d
Antwort3
Nein, Sie können nicht LC_ALL=C TZ=UTC0
aus einer Datei mit lesen date -f
.
cat tz
LC_ALL=C TZ=UTC0
date -f tz
date: invalid date ”LC_ALL=C TZ=UTC0”
Sie können den gesamten Befehl jedoch wie folgt in eine Datei einfügen:
cat date
#!/bin/bash
LC_ALL=C TZ=UTC0 date
Führen Sie es dann über die Befehlszeile aus. Sie erhalten Folgendes:
./date
Tue Sep 27 06:56:29 UTC 2016
Im Gegensatz zur Zeitzone auf meinem Server, die ist:
date
tis 27 sep 2016 08:56:52 CEST