如何在 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
数字和字符串 day
、h
、min
或 sec
之间有空格无关紧要。
这样做的想法是,您要求 date
为您计算所有内容,因为 %s
returns 自 1970-01-01 以来的 unix 时间(以秒为单位)。
man date
:
%s
seconds since 1970-01-01 00:00:00 UTC
我想解析经过的时间(以秒为单位)。时间格式如下:
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
数字和字符串 day
、h
、min
或 sec
之间有空格无关紧要。
这样做的想法是,您要求 date
为您计算所有内容,因为 %s
returns 自 1970-01-01 以来的 unix 时间(以秒为单位)。
man date
:%s
seconds since 1970-01-01 00:00:00 UTC