Wie man Zeitausdrücke in der Shell analysiert?

504
math

Ich möchte ein Shell-Skript mit einem Parameter, der einige Zeit angibt. Gibt es bereits eine Möglichkeit, Zeitausdrücke wie folgt umzuwandeln: 1d, 34m, 3s oder 0.456h oder 23ms in Millisekunden oder Stunden ?, bevor ich sie selbst codiere? Ich verwende hauptsächlich Ubuntu, aber auch andere betriebssystemspezifische Lösungen wären interessant.

Es ist kein Problem, dass andere Tools wie Perl, Python oder Awk involviert sind.

0

1 Antwort auf die Frage

2
m0skit0

Nun, hier ein kurzes schmutziges Perl-Beispiel zum Konvertieren einer Zeichenfolge mit folgendem Format in Millisekunden: "Ad Bh Cm Ds", wobei A, B, C und D Werte für Tag, Stunde, Minute und Sekunde sind. Die Reihenfolge spielt keine Rolle, aber eine Wiederholung wird nicht in Betracht gezogen (z. B. wird nur der erste 'd'-Auftritt verarbeitet, andere werden ignoriert).

#!/usr/bin/perl  use strict;  my @markers = ('d', 'h', 'm', 's'); my @converter = (24*60*60*1000, 60*60*1000, 60*1000, 1000);  my $string = $ARGV[0]; my $total_ms = 0;  while(@markers) { my $cur_mark = shift(@markers); my $cur_convert = shift(@converter); if ($string =~ m/$cur_mark/) { my $pre = $`; $pre =~ m/\b/; $total_ms += $' * $cur_convert;  } }  print("Total miliseconds = $total_ms\n"); 

Anwendungsbeispiele:

./foo.pl "2m 2s" Total miliseconds = 122000 ./foo.pl "0.5h 0.5s" Total miliseconds = 1800500 
Übrigens sollte dies funktionieren, egal in welchem ​​Betriebssystem Sie laufen. m0skit0 vor 13 Jahren 0
Wenn Sie parallele Arrays verwenden, möchten Sie wahrscheinlich einen Hash. Ich würde vorschlagen% markers = ('d' => 24 * 60 * 60 * 1000, 'h' => 60 * 60 * 1000) und dann foreach $ marker (Schlüssel (% marker)) ... dannysauer vor 13 Jahren 2
Sie könnten dann die if-Anweisung wie ($ string = ~ / (\ d +) $ marker \ b /) {$ total + = $ 1 * $ marker {$ marker}} dannysauer vor 13 Jahren 0