如何在 linux 中解析已用时间(以秒为单位)

How to do parsing of Elapsed time in seconds in linux

我想解析经过的时间(以秒为单位)。时间格式如下:

1) 3 day 18h
2) 3 day
3) 3h 15min
4) 3h 
5) 15min 10sec
6) 15min 
7) 10sec

我正在从 systemctl status cassandra | awk '/(Active: active)/{print , ,}' 获取值,现在将它的值存储在变量 A 中,比如

A=$(systemctl status cassandra | awk '/(Active: active)/{print , ,}'

现在 A 输入了 3 天 18 小时或 3 天等。更多示例-

A=3天18小时或3天或3小时15分钟或3小时或15分钟10秒或15分钟或10秒

现在采用不同的 A 值,并在几秒钟内解析。

A的给定值为*:

A="3day 3day/3h 15min/3h/15min 10sec/15min/10sec"

要在几秒钟内计算 A,您可以使用 bash 的参数扩展:

A=${A//day/*86400}                                                       
A=${A//h/*3600}                                                          
A=${A//min/*60}                                                          
A=${A//sec/*1}                                                           
A=${A//\//+}                                                             
A=${A// /+}                                                              
echo "A = $A"                                                            
echo $A | bc                                                             

输出:

A = 3*86400+3*86400+3*3600+15*60+3*3600+15*60+10*1+15*60+10*1            
542720                                                                  

* 请注意,我在这里更改了 OP 提供的 A 的原始值。来自

3 day/3 day/3h... 

3day 3day/3h... # the rest is the same as OP's.

使用 awk s/h/hours/ 并启动 date +"%s" -d "1970-01-01 GMT +" 来解析时间字符串并计算秒数:

$ awk '{
    sub(/h/,"hours")                                          # date no eat h
    =""                                                     # remove 
    "date +\"%s\" -d \"1970-01-01 GMT + " [=10=] "\"" | getline s # date
    print s 
}' file
324000
259200
11700
10800
910
900
10

对于数据:

$ cat file
1) 3 day 18h
2) 3 day
3) 3h 15min
4) 3h 
5) 15min 10sec
6) 15min 
7) 10sec

您想要实现的目标可以直接在 awk 中使用以下行完成:

$ systemctl status cassandra | awk '/(Active: active)/{s=" ";gsub(/-|:/," ",s); print systime() - mktime(s)}'

这将直接根据开始时间为您提供 运行 时间,而不是 systemctl.

打印的近似 运行 时间

如果此方法不起作用,那么我建议使用 date 命令进行所有解析。如果您可以在示例中将 h 更改为 hour,那么您可以执行以下操作:

$ date -d "1970-01-01 + 3day 18hour 15min 16sec" +%s
324916

如果你不能,那么我建议如下。如果持续时间存储在变量 $duration 中,那么你做

$ date -d "1970-01-01 + ${duration/h/hour}" +%s

数字和字符串 dayhminsec 之间有空格无关紧要。

这样做的想法是,您要求 date 为您计算所有内容,因为 %s returns 自 1970-01-01 以来的 unix 时间(以秒为单位)。

man date: %s seconds since 1970-01-01 00:00:00 UTC