2014-11-06 42 views
0

我有巨大的xferlog,我试图解析它。我的日志文件是这样的:我如何使用bash遍历我的日志文件的最后5分钟

Wed Nov 5 16:41:36 2014 1 10.8.0.6 0 /home/spy/16.41.txt b _ i r spy ftp 0 * c 
Wed Nov 5 16:42:07 2014 1 10.8.0.6 0 /home/spy/16.42.txt b _ i r spy ftp 0 * c 
Wed Nov 5 16:43:45 2014 1 10.8.0.6 0 /home/spy/16.43.txt b _ i r spy ftp 0 * c 
Wed Nov 5 16:44:34 2014 1 10.8.0.6 0 /home/spy/16.44.txt b _ i r spy ftp 0 * c 
Wed Nov 5 16:45:57 2014 1 10.8.0.6 0 /home/spy/16.45.txt b _ i r spy ftp 0 * c 
Wed Nov 5 16:46:52 2014 1 10.8.0.6 0 /home/spy/16.46.txt b _ i r spy ftp 0 * c 
Wed Nov 5 16:46:55 2014 1 10.8.0.6 0 /home/spy/16.46.2.txt b _ i r spy ftp 0 * c 
Wed Nov 5 16:47:23 2014 1 10.8.0.6 0 /home/spy/16.47.txt b _ i r spy ftp 0 * c 

我的bash脚本读取日志文件(同时所有行)并执行某些操作。我需要为没有最后5分钟的日志文件运行我的脚本(不是最后几行,因为我不知道有多少行)。

我该怎么办?

bash脚本是这样的:

#!/bin/bash 

while read -r ... 
do 
... 
done < $LOG 

我的第二个问题,我怎么能传递线,在最后5分钟的时间间隔:

登录:

Wed Nov 5 16:41:36 2014 1 10.8.0.6 0 /home/spy/16.41.txt b _ i r spy ftp 0 * c 
Wed Nov 5 16:42:07 2014 1 10.8.0.6 0 /home/spy/16.42.txt b _ i r spy ftp 0 * c 
Wed Nov 5 16:43:45 2014 1 10.8.0.6 0 /home/spy/16.43.txt b _ i r spy ftp 0 * c 
Wed Nov 5 16:44:34 2014 1 10.8.0.6 0 /home/spy/16.44.txt b _ i r spy ftp 0 * c 
Wed Nov 5 16:44:59 2014 1 10.8.0.6 0 /home/spy/16.44.txt b _ i r spy ftp 0 * c 
Wed Nov 5 16:45:00 2014 1 10.8.0.6 0 /home/spy/16.45.txt b _ i r spy ftp 0 * c 
Wed Nov 5 16:46:52 2014 1 10.8.0.6 0 /home/spy/16.46.txt b _ i r spy ftp 0 * c 
Wed Nov 5 16:46:55 2014 1 10.8.0.6 0 /home/spy/16.46.2.txt b _ i r spy ftp 0 * c 
Wed Nov 5 16:47:23 2014 1 10.8.0.6 0 /home/spy/16.47.txt b _ i r spy ftp 0 * c 

最后一行16时47分23秒。我需要通过16:45:00-16:49:59行。我需要打印:

Wed Nov 5 16:41:36 2014 1 10.8.0.6 0 /home/spy/16.41.txt b _ i r spy ftp 0 * c 
Wed Nov 5 16:42:07 2014 1 10.8.0.6 0 /home/spy/16.42.txt b _ i r spy ftp 0 * c 
Wed Nov 5 16:43:45 2014 1 10.8.0.6 0 /home/spy/16.43.txt b _ i r spy ftp 0 * c 
Wed Nov 5 16:44:34 2014 1 10.8.0.6 0 /home/spy/16.44.txt b _ i r spy ftp 0 * c 
Wed Nov 5 16:44:59 2014 1 10.8.0.6 0 /home/spy/16.44.txt b _ i r spy ftp 0 * c 

所以当我有新的生产线是这样的:

Wed Nov 5 16:50:00 2014 1 10.8.0.6 0 /home/spy/16.50.txt b _ i r spy ftp 0 * c 

我需要通过16:50:00-16:54:59。

+2

[摘录最后从日志文件10分钟(可能重复http://stackoverflow.com/questions/20649387/extract-last-10-minutes -from-logfile) – aphex 2014-11-06 13:16:22

+0

我无法理解关于此主题的答案。我不想显示最后5分钟或10分钟。我不想跑过去5分钟。我想在最后5分钟之前跑步。 – phe 2014-11-06 14:36:51

+0

您好volkanasr,更多地解释您的情况和您的要求,以及“最后5分钟前”是什么意思,这意味着从前5-10分钟回来? – 2014-11-06 14:49:00

回答

2

既然你说你的文件相当大,你不想为每一行解析和调用date,那会很慢。这留下解析具有日期解析功能的语言的文件。下面是一些Perl:

perl -MTime::Piece -MTime::Seconds -Mautodie -e ' 
    sub entry_time { 
     Time::Piece->strptime(substr(shift, 0, 24),"%a %b %e %T %Y"); 
    } 

    $filename = shift; 
    $last_line = qx{ tail -n1 $file }; 
    $last_time = entry_time $last_line; 
    $five_minutes_ago = $last_time - 5*ONE_MINUTE; 

    open $fh, "<", $filename; 
    while (<$fh>) { 
     $time = entry_time $_; 
     last if $time > $five_minutes_ago; 
     print; 
    } 
    close $fh; 
' xferlog 

使用bash

entry_time() { 
    date -d "$(cut -c 1-24 <<< "$1")" +%s 
} 

LOG=xferlog 
cutoff=$(($(entry_time "$(tail -n1 "$LOG")") - 5*60)) 

while IFS= read -r line; do 
    t=$(entry_time "$line") 
    ((t > cutoff)) && break 
    echo "$line" 
done < "$LOG" 
+0

谢谢,但由于编辑我的第一篇文章而对错误的理解抱歉。我不需要最后5分钟的日志文件。我需要所有行,没有最后5分钟的日志文件。我需要阅读最后一行时间并返回5分钟,并且不要执行最后5分钟文件的任何操作。例如在我的帖子最后一行16:47:21。我需要跳过这两行 - > 16:42 - 16:47:21。 – phe 2014-11-06 15:14:12

+1

我会尽快编辑我的答案 – 2014-11-06 15:35:50

+0

谢谢,所以我不能只用bash做这个:)? – phe 2014-11-06 15:57:40

相关问题