grep最后2分钟的日志?

时间:2013-11-16 20:59:16

标签: shell sed awk

我有以下格式生成的日志文件。  我想每2分钟grep一次日志并检查错误  使用shell脚本我怎么能得到这个?  任何帮助将不胜感激。

[12:17:02.1274]
[12:18:01.1976]
[12:18:01.2151]
[12:18:01.2152]
[12:18:01.4607]
[12:18:02.6306]
[12:18:03.7299]
[12:18:04.0307]
[12:18:04.1388]
[12:18:04.2068]
[12:18:06.4002]
[12:18:07.5805]
[12:19:01.8559]
[12:19:08.9950]
[12:19:09.2851]
[12:19:10.4704]
[12:19:12.8167]
[12:20:01.8968]
[12:20:01.9206]
[12:20:01.9206]
[12:20:02.1707]
[12:20:02.3064]
[12:20:05.4461]
[12:20:13.7205]
[12:20:14.0807]
[12:20:14.2360]
[12:20:17.3764]
[12:21:01.2299]
[12:21:10.4769]
[12:21:18.8085]
[12:21:19.1106]
[12:21:19.2456]
[12:21:22.3663]

2 个答案:

答案 0 :(得分:1)

您可以使用sleep功能。

尝试例如:

#!/bin/bash
echo start
sleep 2
echo end

两个echo命令之间会等待2秒。


您的完整脚本可能是:

#!/bin/bash    
while [ 1 ]; do
        sleep 2m
        if grep -qvE "^\[[0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]{4}\]" logfile.dat
        then
                echo "ERROR"
        else
                echo "Everything is fine..."
        fi
done

while-loop 始终在运行,因为1true。在这个无限循环中,每两分钟(2m)检查就完成了。

修改

我更新了代码,以便解析您给出的数据结构。我使用grep

  • -E启用正则表达式的使用
  • -v仅匹配反向(意味着它会搜索您的结构,并且如果此模式匹配,则实际上正在进行重叠)
  • -q使用安静模式,如果找到匹配则立即退出

如果 logfile.dat 与您提供的样式不完全相同,则grep匹配, ERROR 写入STDOUT,这通常是您的终端

答案 1 :(得分:0)

sed -n "$ s/\[\([0-9.:]*\)\].*/\1/p" | read Marker
while [ 1 ]
 do
   sleep 120
   sed -n "$ s/\[\([0-9.:]*\)\].*/\1/p" | read NewMarker
   sed -n "/${Marker/,/${NewMarker}/ p"
   Marker="${NewMarker}"
 done

它只打印两次标记值(最后一个圆圈为1作为最后一行),另一个在当前周期为1s行。可以将p替换为/${Marker}/ !p来修改它。

如果日志永远不会关闭(如果没有发生EOF),则可能无法正常工作,因为sed会等到没有显式退出的情况。