2017-02-22 4 views
1

Ich versuche den Unterschied zwischen dem letzten und letzten Passwort zu finden. Also ich habe das bisher. Ich versuche gerade, dieses Datum in Tage umzuwandeln, also kann ich das gegenwärtige Datum in den Tagen - das letzte Zurückstellungsdatum in den Tagen subtrahieren und einen Ganzzahlwert erhalten.KSH messen verstrichene Zeit

$ LASTRESETDATE=$(echo $(passwd -s) | cut -d' ' -f3) 
$ echo $LASTRESETDATE 
12/15/16 

die das Datum verion Suche ich habe gibt es keine Option für -d

$ date -h 
date: illegal option -- h 
Usage: date [-u] [+format] 
     date [-u] [mmddhhmm[[cc]yy]] 
     date [-a [-]sss.fff] 
+1

** bearbeiten **: Wenn Sie mit hp-ux festgefahren sind (und Sie befinden sich wahrscheinlich in einer Unternehmensumgebung, in der Sie GNU-Tools ** nicht installieren können), müssen Sie Ihre eigenen codieren Funktionen, um Daten in manipulierbare Werte zu konvertieren. Meine Antwort auf stackoverflow.com/questions/8606520/converting-dates-in-shel l/... ist Teil der Lösung. Suchen Sie nach '[linux] awk date math' (und anderen ähnlichen Suchzielen), um vollständigere Lösungen zu finden. Viel Glück. – shellter

Antwort

1

Nicht sicher, welche Version von ksh Sie verwenden.

[STEP 101] $ echo ${.sh.version} 
Version AJM 93u+ 2012-08-01 
[STEP 102] $ date=12/15/16 
[STEP 103] $ [[ $date =~ (..)/(..)/(..) ]] 
[STEP 104] $ date=20${.sh.match[3]}-${.sh.match[1]}-${.sh.match[2]} 
[STEP 105] $ echo $date 
2016-12-15 
[STEP 106] $ old_seconds=$(printf '%(%s)T' $date) 
[STEP 107] $ echo $old_seconds 
1481797007 
[STEP 108] $ now_seconds=$(printf '%(%s)T') 
[STEP 109] $ echo $now_seconds 
1487845024 
[STEP 110] $ ((diff = now_seconds - old_seconds)) 
[STEP 111] $ echo $diff 
6048017 
[STEP 112] $ echo $((diff/86400)) days 
70 days 
[STEP 113] $ 
+0

$ echo $ {. Sh.version} ksh: $ {. Sh.version}: schlechte Ersetzung – user3753693

+0

Sie verwenden also eine sehr alte ksh (vielleicht ksh88?). – pynexj

+0

Yep fand das $ strings/bin/ksh | grep Version | Schwanz -2 @ (#) Version 11/16/88 – user3753693

1

Wenn Sie awk haben, können Sie den Unterschied mit

LASTRESETDATE="12/15/16" 
endd="$(date '+%m/%d/%y')" 

awk -v startdate="${LASTRESETDATE}" -v enddate="${endd}" 'BEGIN { 
    split(startdate,A,"[/]"); 
    T1=mktime(A[3] " " A[1] " " A[2] " 12 0 0"); 
    split(enddate,B,"[/]"); 
    T2=mktime(B[3] " " B[1] " " B[2] " 12 0 0"); 
    diffdays=(T2-T1)/(3600*24) 
    printf("%s\n",diffdays); 
}' 

berechnen Wenn Sie dies oft benötigen, und Sie müssen nicht (die richtige Version) awk können Sie eine Lookup machen Tabelle auf einem anderen System. Mit awk:

startd="12/15/16" 
endd="$(date '+%m/%d/%y')" 

awk -v startdate="${startd}" -v enddate="${endd}" 'BEGIN { 
    split(startdate,A,"[/]"); 
    T1=mktime(A[3] " " A[1] " " A[2] " 12 0 0"); 
    split(enddate,B,"[/]"); 
    T2=mktime(B[3] " " B[1] " " B[2] " 12 0 0"); 
    linenr=1; 
    while (T1 < T2) { 
     printf("%d %s\n",linenr++, strftime("%m/%d/%y",T1)); 
     T1+=3600*24; 
    } 
}' 

Natürlich können Sie eine Liste mit Excel oder einem anderen Werkzeug machen.

EDIT: entfernt var, dass ich nur Prototyping die Lösung verwendet.

+0

Wenn ich dies verwende, sagt es "ksh: str: Parameter nicht gesetzt", wenn ich die -v Zeichenfolge = $ "{str}" entfernen. Es gibt einen Fehler in der mktime Funktion, der sagt, dass es nicht definiert ist. – user3753693

+0

Ich entfernte die nicht verwendete Zeichenfolge. Das mktime ist eine gawk-Erweiterung, deine awk-Version unterstützt es nicht.Wenn Sie nicht in Staunen versetzt werden können, ziehen Sie in Betracht, eine Datei vom Typ "Lookup.csv" von Excel mit einem Datum in jeder Zeile zu erstellen. Mit etwas wie 'grep -n' (oder einer zweiten Excel-Spalte) können Sie die Wäschemengen bekommen und den Unterschied nachschlagen. –

2

Als ich das Pech hatte, HP-UX Idiosynkrasien durchgehen zu müssen, schrieb ich oft meine eigenen kleinen Programme, um genau das zu tun, was ich wollte. Vorausgesetzt, Ihr Hokey-pux Maschine ist POSIXy, dann könnten Sie tun:

$ cat fromnow.c 
#include <time.h> 
#include <stdio.h> 

int main(int argc, char *argv[]) { 
    struct tm parsed; 
    strptime(argv[1], argv[2], &parsed); 
    printf("%.0f\n", difftime(time(NULL), mktime(&parsed))); 
    return 0; 
} 

Kompilieren es:

$ cc -o fromnow fromnow.c 

Run it:

$ ./fromnow 5/13/13 %D 
119451988 

die dann berechnen die Anzahl der Sekunden zwischen der aktuellen Uhrzeit und dem Datum "5/13/13" im amerikanischen Stil "% D" formatiert. Das erste Argument ist das Datum, das zweite Argument ist der Formatbezeichner zum Analysieren dieses Datums. Optionen siehe man strptime.

Dies könnte allgemeiner oder weniger gemacht werden, je nachdem, wie viel Datumsberechnungen erforderlich sind.

+0

Niemand in meinem Team kennt C, also kann ich es nicht benutzen. Ich habe die Möglichkeit, Perl oder KSH zu verwenden – user3753693

Verwandte Themen