我如何将“系统正常运行时间:2天,9小时,16分钟,5秒”转换为bash日期?
我想将此日期与另一个日期进行比较。
提前。
答案 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
创建一个文件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
}
运行以下命令:
$ 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
将自动将变量RSTART
和RLENGTH
设置为找到的子字符串的位置及其长度。这样,命令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