如何在bash中将日志文件条目日期转换为将来的日期

时间:2013-09-16 17:41:24

标签: bash date datetime date-arithmetic

我确信这个答案是显而易见的,但是我正在敲打它并且头疼,我的搜索Foo让我失望......

我有一个日期格式的日志文件:

Sep  1 16:55:00 stuff happening 
Sep  1 16:55:01 THIS IS THE LINE YOU WANT at this time stamp
Sep  1 16:55:02 more stuff
Sep  1 16:55:02 THIS IS THE LINE YOU WANT at this time stamp
Sep  1 16:55:03 blah
Sep  1 16:55:04 blah and so on…..

我的最终目标是:

  1. 使用给定的字符串查找日志文件中的最后一行,例如:“这就是线......”这是我将在稍后进行计算的“神奇时间”。

  2. 获取该行的日期并设置一个日期为+ NN秒的变量。从第1步开始,将来的时间通常会短短24小时,如果这很重要,可能会进入第二天。

  3. 在脚本中的某个时刻,将系统时钟提前到新的日期/时间,之后我将检查要触发的某些事件。

  4. 我知道这是错误的,但到目前为止我已经想出了如何:

    1. 抓住我活动的最后日期戳。

      LOGDATE = cat /logdir/my.log | grep "THIS IS THE LINE" | tail -1 | cut -f1,2,3 -d" "

    2. 返回:9月1日16:55:02

      1. 将日期转换为更实用的格式

        logDate2 =“$(date -d”$ logDate“+”%m-%d%H:%M:%S“)”; echo $ logDate2

      2. 返回:09-17 16:55:02

        1. 我被困在这里 - 我想要的是:

          futuredate = $logdate2 + XXXSeconds

        2. 有人可以帮助我计算时间,或者指出更好的方法来完成所有这些工作吗?

          感谢。

2 个答案:

答案 0 :(得分:1)

I'm stuck here - what I want is:
futuredate=$logdate2 + XXXSeconds

您可以通过时间戳转换来实现:

# convert log date to timestamp
logts="$(date -d "$logDate" '+%s')" 

# add timestamp with seconds
futurets=$(( logts + XXXSeconds ))

# get date based from timestamp, optionally you can add a format.
futuredate=$(date -d "@${futurets}")

答案 1 :(得分:1)

# Get time in seconds from the epoc (1970-01-01 00:00:00 UTC)

dateinseconds=$(date +"%s" -d "$(tail -1 logfile | grep "THIS IS THE LINE" | awk '{print $1, $2, $3}')")

# You can also use just awk without grep and tail to match and print the last line
dateinseconds=$(date +"%s" -d "$(awk '{/THIS IS THE LINE/}END{print $1, $2, $3}' logfile)")

gotofuture=$(( $dateinseconds + 2345 ))  # Add 2345 seconds
newdate=$(date -d "@${gotofuture}")
echo "$newdate"