在以下文件中找到时差

时间:2015-02-22 20:46:14

标签: shell awk

首先感谢论坛成员 我需要使用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

1 个答案:

答案 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并不是你想要依赖的东西。