【问题标题】:KSH measure elapsed timeKSH 测量经过时间
【发布时间】:2017-07-13 05:08:18
【问题描述】:

我正在尝试查找上次密码休息时间与当前密码之间的天差。所以到目前为止我有这个。我正在尝试将该日期转换为天数,以便我可以减去当前日期(以天为单位) - 最后一个重置日期(以天为单位)并获得一个整数值。

$ 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]

【问题讨论】:

  • edit :假设您被 hp-ux 困住(而且您可能处于无法安装 GNU 的企业环境中工具),您必须编写自己的函数来将日期转换为可操作的值。我在 stackoverflow.com/questions/8606520/converting-dates-in-shel‌​l/... 上的回答是解决方案的一部分。搜索[linux] awk date math(和其他类似的搜索目标)以找到更完整的解决方案。祝你好运。

标签: unix ksh hp-ux


【解决方案1】:

当我不幸不得不通过 HP-UX 的特性苦苦挣扎时,我经常编写自己的小程序来完成我想做的事情。如果你的 hokey-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。

这可以更通用或更简单,具体取决于您需要进行多少日期计算。

【讨论】:

  • 我的团队中没有人知道 C,所以我不能使用它。我可以选择使用 Perl 或 KSH
【解决方案2】:

不确定您使用的是哪个版本的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] $

【讨论】:

  • $ echo ${.sh.version} ksh: ${.sh.version}: 替换错误
  • 所以您使用的是非常旧的 ksh(可能是 ksh88?)。
  • 是的,找到了这个 $ strings /bin/ksh | grep 版本 | tail -2 @(#)版本 11/16/88
  • @user3753693 我的哀悼。
  • @bishop 如果我至少可以使用 python,我的生活会轻松很多
【解决方案3】:

当你有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 或其他工具来制作列表。

编辑:删除了我仅用于原型解决方案的 var。

【讨论】:

  • 当我使用它时,当我删除 -v string=$"{str}" 时,它会显示“ksh: str: parameter not set”。它在 mktime 函数上给出一个错误,说它没有定义。
  • 我删除了未使用的字符串。 mktime 是一个 gawk 扩展,您的 awk 版本不支持它。当您无法获得 gawk 时,请考虑从 excel 中制作一个 lookup.csv 文件,每行有一个日期。使用grep -n(或第二个 excel 列)之类的内容,您可以获得行号并查找差异。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-05
  • 2011-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-06
  • 2022-09-26
相关资源
最近更新 更多