2017-02-22 67 views
1

我正在嘗試查找密碼從上次密碼休息到當前的日差異。所以我有這個到目前爲止。我正在嘗試將該日期轉換爲日期,以便我可以以天爲單位減去當前日期 - 以天爲單位的最後重置日期並獲取整數值。KSH衡量已用時間

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

展望日期優化版本我已經有用於-d

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

**編輯**:由於您被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

是的,發現這個$ strings/bin/ksh | grep版本|尾巴-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中,你可以做一個lookup-另一個系統上的表。 隨着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或其他工具的列表。

編輯:刪除var,我只使用原型解決方案。

+0

當我使用它時,它說:「ksh:str:parameter not set」當我刪除-v string = $「{str}」時。它在mktime函數上給出了一個錯誤,說它沒有被定義。 – user3753693

+0

我刪除了未使用的字符串。 mktime是一個gawk擴展,你的awk版本不支持它。當你無法獲得gawk時,考慮從excel中創建一個lookup.csv文件,並在每行上記錄一個日期。有了像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 

這將進而計算出秒數當前時間與美式「%D」格式的日期「5/13/13」之間。第一個參數是日期,第二個參數是分析該日期的格式說明符。有關選項,請參閱man strptime

根據你需要做多少日期計算,這可以做得更一般或更少。

+0

我的團隊中沒有人知道C,所以我不能使用它。我有選擇使用Perl或KSH – user3753693