¿Cómo analizar expresiones de tiempo en shell?

0

Quiero tener un script de shell con un parámetro que especifique algún tiempo. ¿Ya existe una forma de transformar las expresiones de tiempo a: 1d, 34m, 3s o 0.456h, o 23ms en digamos solo milisegundos, u horas? ¿Antes de comenzar a codificarlo por mi cuenta? Principalmente utilizo Ubuntu, pero otras soluciones específicas del sistema operativo también serían interesantes.

No es un problema que otras herramientas como perl, python o awk estén involucradas.

math
fuente

Respuestas:

2

Bueno, aquí hay un ejemplo rápido de Perl al convertir a milisegundos una cadena con el siguiente formato: "Ad Bh Cm Ds" donde A, B, C y D son valores para día, hora, minuto y segundo respectivamente. El orden no importa, pero no se contempla la repetición (por ejemplo, solo se procesará la primera apariencia 'd', se ignorarán las demás).

#!/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");

Ejemplos de uso:

./foo.pl "2m 2s"
Total miliseconds = 122000
./foo.pl "0.5h 0.5s"
Total miliseconds = 1800500
m0skit0
fuente
Por cierto, esto debería funcionar sin importar en qué sistema operativo estés ejecutando.
m0skit0
2
Si está utilizando matrices paralelas, es probable que desee un hash. Sugeriría% markers = ('d' = & gt; 24 * 60 * 60 * 1000, 'h' = & gt; 60 * 60 * 1000), y luego foreach $ marker (teclas (% markers)) ...
dannysauer
Luego, podría hacer la instrucción if más como if ($ string = ~ / (\ d +) $ marker \ b /) {$ total + = $ 1 * $ marcadores {$ marker}}
dannysauer