使用shell从日志文件中提取基于时间戳的数据

时间:2016-03-03 05:50:06

标签: bash shell

我有一个日志文件,其中数据继续附加取决于服务器停止和启动。现在我想找出服务器的停机时间,即无法使用的时间。

这里的主要问题是有多条停止和启动线,因此需要找出停止服务器线,然后找到服务器启动的下一行,然后是时间差异。

有人可以帮助我吗?

我会在这里粘贴部分日志。  模式是:Stopping ContainerStarted Module cloud.services.CloudInstance

[2016-03-02 14:25:09,864 (INFO )][Thread-1]  Wed Mar 02 14:25:09 UTC 2016 Stopping Container <main>...
[2016-03-02 14:25:09,864 (INFO )][Thread-1]  Wed Mar 02 14:25:09 UTC 2016 Stopping WebServer...
[2016-03-02 14:25:09,872 (ERROR)][Thread-1]  [Thread-1] INFO org.eclipse.jetty.servlet.listener.ELContextCleaner - javax.el.BeanELResolver purged
[2016-03-02 14:25:09,872 (ERROR)][Thread-1]  [Thread-1] INFO org.eclipse.jetty.server.handler.ContextHandler - stopped o.e.j.w.WebAppContext{//}
[2016-03-02 14:25:10,009 (ERROR)][Thread-1]  [Thread-1] WARN org.eclipse.jetty.util.thread.QueuedThreadPool - 103 threads could not be stopped

-----

[2016-03-02 10:34:04,628 (ERROR)][main]  [main] INFO org.eclipse.jetty.server.AbstractConnector - Started SelectChannelConnector@0.0.0.0:9192
[2016-03-02 10:34:04,628 (INFO )][main]
Started Module cloud.services.CloudInstance@6232a3cd

先谢谢,

1 个答案:

答案 0 :(得分:0)

grep将根据模式匹配

获取数据
grep 'Stopping Container' server.log >stoptimings.txt
grep 'Started Module cloud.services.CloudInstance' server.log >starttimings.txt

EDIT1:

您可以使用下面的awk(不是单行)

cat stoptimings.txt | awk '
BEGIN{
FS="["
}
{
  curTime=substr($2,12,8)
  m=split(curTime,t,":")
  n=split(prevTime,w,":")
  firstTime= (t[1]*3600) + (t[2]*60) + t[3]
  secondTime= (w[1]*3600) + (w[2]*60) + w[3]
  diffTime=(firstTime - secondTime)
  prevTime=curTime
  printf("%s|%s|%s|%s\n",curTime,firstTime,secondTime,diffTime)
}'

差异时间将以秒为单位打印。您可以使用以下代码来获得分钟差异

diffTime=(firstTime - secondTime) / 60