首先感谢论坛成员 我需要使用awk / shell找到时间差b' w两行时间戳。
这是日志文件:
cat business_file
start:skdjh:22:06:2010:10:30:22
sdfnskjoeirg
wregn'wergnoeirnfqoeitgherg
end:siifneworigo:22:06:2010:10:45:34
start:srsdneriieroi:24:06:2010:11:00:45
dfglkndfogn
sdgsdfgdfhdfg
end:erfqefegoieg:24:06:2010:11:46:34
oeirgoeirg\
start:sdjfhsldf:25:07:2010:12:55:43
wrgnweoigwerg
ewgjw]egpojwepr
etwasdf
gwdsdfsdf
fgpwj]pgojwth
wtr
wtwrt
end:dgnoeingwoit:25:07:2010:01:42:12
===========
上面的日志文件是一种api文件,有些行以" start"开头。并且"结束"以及相应行的第3行到行的结尾是时间戳(将分隔符作为":") 我们必须找到开始和结束时间连续行之间的时差
希望我清楚这个问题,如果您需要更多解释,请告诉我。
THX Srinivas
答案 0 :(得分:1)
由于时间戳由与行的其余部分相同的字段分隔符分隔,因此甚至不需要手动拆分。简单地
awk -F : 'function timestamp() { return mktime($5 " " $4 " " $3 " " $6 " " $7 " " $8) } $1 == "start" { t_start = timestamp() } $1 == "end" { print(timestamp() - t_start) }' filename
以秒为单位工作并打印时差。代码是
# return the timestamp for the current row, using the pre-split fields
function timestamp() {
return mktime($5 " " $4 " " $3 " " $6 " " $7 " " $8)
}
# in start lines, remember the timestamp
$1 == "start" {
t_start = timestamp()
}
# in end lines, print the difference.
$1 == "end" {
print(timestamp() - t_start)
}
如果您想以其他方式格式化时差,请参阅相关功能的this handy reference。顺便说一下,你的例子中的最后一个块有几个小时的负长度。你可能想看一下。
附录:如果由于某些国家/地区的am / pm事件,这会打开一堆蠕虫,因为所有时间戳都有两种可能的含义(因为日志文件似乎不包含这些信息)无论是上午或下午时间戳,所以你有一个无法解决的问题,持续时间超过半天。如果你知道持续时间永远不会超过半天,并且结束时间总是在开始时间之后,你可能会用
之类的东西来破解它。$1 == "end" {
t_end = timestamp();
if(t_end < t_start) {
t_end += 43200 # add 12 hours
}
print(t_end - t_start)
}
...但在这种情况下,日志文件格式已损坏且应该修复。从长远来看,这种hackery并不是你想要依赖的东西。