将星号正常运行时间字符串转换为日期

时间:2019-10-15 14:28:49

标签: bash date asterisk

我如何将“系统正常运行时间:2天,9小时,16分钟,5秒”转换为bash日期?

我想将此日期与另一个日期进行比较。

提前。

3 个答案:

答案 0 :(得分:1)

假设消息将始终在固定位置包含所有日期组件,则可以使用Unix时间戳(历时秒)进行计算。

# Set t from command, or file.
t="System uptime: 2 days, 9 hours, 16 minutes, 5 seconds"
# Split into words
read -a p <<< "$t"
# Uptime in seconds
uptime=$((p[2]*24*60*60+p[4]*60*60+p[6]*60+p[8]))
now=$(date '+%s')
up_ts=$((now-uptime))
echo "Timestamp: $up_ts"
# Convert to human readable date.
up_date=$(date +'%Y-%m-%d %H:%M:%S' -d "@$up_ts")
echo "Date: $up_date"

您还可以在'up_ts'上使用bash内置的日期格式。

如果正常运行时间消息的格式取决于值(例如,正常运行时间<1天,则不包括天数),则需要进行其他解析。

答案 1 :(得分:1)

在这里您找到了一种可靠的方法,可以将您的持续时间转换为总秒数。这是可靠的,因为它不需要列出所有数量。即输出可以是以下任意一项:

 System uptime: 16 minutes, 2 seconds
 System uptime: 12 days, 3 seconds
 System uptime: 15minutes,12hours
  1. 创建一个文件convert.awk,其中包含

    BEGIN { a["seconds"]=1; a["minutes"]=60
            a["hours"]=3600; a["days"]=86400;
            a["weeks"]=7*86400 }
    { tmp=tolower($0) }
    { while (match(tmp,/[0-9]+[^a-z]*[a-z]+/)) {
        u=substr(tmp,RSTART,RLENGTH); q=u+0; gsub(/[^a-z]/,"",u)
        t+=q*a[u]
        tmp=substr(tmp,RSTART+RLENGTH)
      }
      print t
    }
    
  2. 运行以下命令:

    $ echo "System uptime: 2 days, 9 hours, 16 minutes, 5 seconds" | awk -f convert.awk
    206165
    $ echo "System uptime: 2 weeks, 9 days, 16 minutes, 5 seconds" | awk -f convert.awk
    1988165
    

工作原理:

例如,当我们读一行时。

tmp="system uptime: 16 minutes, 2 seconds"

match命令将搜索任何以数字开头和以字符串结尾的子字符串。 match将自动将变量RSTARTRLENGTH设置为找到的子字符串的位置及其长度。这样,命令u=substr(tmp,RSTART,RLENGTH)将设置

u="16 minutes"

您现在可以对此进行算术运算以提取第一个数字。这与awk一起使用,因为它将忽略数字后的任何内容,将任何以数字开头的字符串转换为数字。因此q=u+0创建了

q=16

最后,我们从u中删除所有导致后退的字符

u="minutes"

下一步,我们将删除已处理的内容,以重新定义tmp

tmp=", 2 seconds"

然后重新开始该过程。

答案 2 :(得分:-1)

请注意,uptime命令从/proc/uptime获取数据

所以一种方法是获取第一个字段值,即以秒为单位的总经过时间,并将其输入到date命令中:-

这是一个示例:-

$ cat /proc/uptime
8743161.15 7738916.50

$ date -d'-8743161.15 seconds'
Sat Jul  6 06:00:37 EDT 2019