2017-02-22 82 views
1

Я пытаюсь найти разницу в день от последнего времени, когда пароль был до конца текущего. Так что у меня это до сих пор. Я пытаюсь просто преобразовать эту дату в дни, поэтому я могу вычесть текущую дату в днях - последнюю дату сброса в днях и получить целочисленное значение.KSH измеренное время

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

Глядя на дату Verion у меня там нет возможности для -d

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

** edit **: учитывая, что вы застряли в hp-ux (и вы, вероятно, находитесь в корпоративной среде, где вы ** не можете устанавливать GNU-инструменты **), вам придется закодировать свои собственные функции для преобразования дат в управляемые значения. Мой ответ на stackoverflow.com/questions/8606520/converting-dates-in-shel l/... является частью решения. Найдите '[linux] awk date math' (и другие аналогичные цели поиска), чтобы найти более полные решения. Удачи. – shellter

ответ

1

Не уверен, какая версия ksh вы используете.

[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}: плохая замена – user3753693

+0

Итак, вы используете очень старый ksh (возможно, ksh88?). – pynexj

+0

Yep нашел это $ strings/bin/ksh | Версия grep | tail -2 @ (#) Версия 11/16/88 – user3753693

1

Если у вас есть awk, вы можете вычислить разницу с

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); 
}' 

Когда вам это нужно часто, и вы не имеете (правильный вариант) AWK, вы можете сделать Поиск- таблицу на другой системе. С 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; 
    } 
}' 

Конечно вы можете сделать список с Excel или другой инструмент.

EDIT: удаленный var, который я использовал только для прототипирования решения.

+0

Когда я использую это, он говорит «ksh: str: параметр не установлен», когда я удаляю -v string = $ "{str}". Это дает ошибку в функции mktime, говорящей, что она не определена. – user3753693

+0

Я удалил неиспользуемую строку. Mktime - расширение gawk, ваша версия awk не поддерживает его.Когда вы не можете получить gawk, подумайте над созданием файла lookup.csv из excel witjh по одной дате в каждой строке. С чем-то вроде 'grep -n' (или второго столбца excel) вы можете получить количество полос и посмотреть разницу. –

2

Когда я был достаточно неудачен, чтобы проваливаться через особенности HP-UX, я часто писал свои собственные небольшие программы, чтобы делать именно то, что я хотел. При условии, ваш фальшивый-Pux машина POSIXy, то вы можете сделать:

$ 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; 
} 

Собирать:

$ cc -o fromnow fromnow.c 

Выполнить это:

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

, который будет затем вычислить количество секунд между текущим временем и датой «5/13/13», отформатированной в американском стиле «% D». Первый аргумент - это дата, второй аргумент - спецификатор формата для синтаксического анализа этой даты. См. man strptime для параметров.

Это можно сделать более общим или менее, в зависимости от того, сколько вам нужно для расчета дат.

+0

Никто в моей команде не знает C, поэтому я не могу его использовать. У меня есть варианты использования Perl или KSH – user3753693

 Смежные вопросы

  • Нет связанных вопросов^_^