2010-08-24 68 views
1

我需要使用shell脚本(bash)从日志文件中提取一些信息。从日志文件中的线一般是这样的:使用Bash从日志文件中选择时间间隔

2009-10-02 15:41:13,796| some information 

有时,这样的行后跟几行提供有关事件的详细信息。这些额外的行没有特定的格式(特别是它们不以时间戳开始)。

我知道如何使用grep根据关键字和表达式过滤文件。基本上我遇到的麻烦是有时我只需要看特定的时间间隔。例如,我只需要看看最近X分钟发生的事件。我对shell脚本没有经验,但由于时间格式的复杂性,这对我来说似乎是一项相当困难的任务。另一方面,我可以想象这不是很不寻常,所以我想知道是否有一些工具可以让我更容易,或者如果你能给我一些关于如何解决这个问题的提示?

+0

感谢您的所有答案。不幸的是,很多东西在服务器上都不支持(没有带%s参数的日期,没有phython,systime()也不行)。我决定现在使用Perl,因为它提供了一些缺少的方便的时间函数。尽管如此,你的评论给了我很多有用的提示! – bufferUnderrun 2010-08-25 14:26:15

回答

1
gawk -F"[-: ]" 'BEGIN{ 
    fivemin = 60 * 60 * 5 #last 5 min 
    now=systime() 
    difference=now - fivemin 
} 
/^20/{ 
    yr=$1 
    mth=$2 
    day=$3 
    hr=$4 
    min=$5 
    sec=$5 
    t1=mktime(yr" "mth" "day" "hr" "min" "sec) 
    if (t1 >= difference) { 
    print 
    } 
}' file 
+0

@ ghostdog74:这似乎无法处理OP在其日志文件中的额外信息行。不过,我喜欢它。 – 2010-08-24 12:50:01

0

您可能想看看my Python program,它根据一段时间从日志文件中提取数据。日期的规范尚未实现(它的目的是大致看最近的24小时)。它期望的时间格式(例如Jan 14 04:10:13)看起来与你想要的有些不同,但可以改编。我没有用非时间戳线测试它,但它应该在指定的时间范围内打印所有内容。

这会给你一些使用信息:

timegrep.py --help 
1

基本上我遇到的麻烦的是,有时我需要看看 只在特定的时间间隔。

你可以使用date的日期签名转换为你与%s参数:

%s  seconds since 1970-01-01 00:00:00 UTC 

有了它,我们可以做一个小的演示:

#!/bin/bash 

timespan_seconds=300 # 5 minutes 

time_specified=$(date +"%s" -d "2010-08-25 14:54:40") 

let time_now=$(date +"%s") 
let time_diff=($time_now - $timespan_seconds) 

if [ $time_specified -ge $time_diff ]; then 
     echo "Time is within range" 
fi 

注意,这并未不会处理未来的时间。