免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3529 | 回复: 9
打印 上一主题 下一主题

用PERL读动态增长文件的问题. [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-08-22 00:13 |只看该作者 |倒序浏览
10可用积分
我现在想用PERL做一个类似 TAIL -F 的功能. 也就是读一个大的动态增长的问件. 在读完第一遍之后, 文件会变大.这时候我想跳到文件的末尾,然后重现开始读后面新加的部分.

网上找到了一个教程. 连接如下: http://oreilly.com/catalog/cookbook/chapter/ch08.html (在Trailing a Growing File这一段)

但是试了上面提到的3个方法, SEEK, CLEARERR 等, 都不行. 现象是在读完第一遍之后,就再也读不到新东西了.
也试了下载一个摸块: http://search.cpan.org/dist/File-Tail/
但是也不行. 到了 FILE->READ 之后就不动了.

哪位有更好的建议? 多谢

我的环境: CENTOS 5.3 64BIT. PERL 5.8.8

论坛徽章:
0
2 [报告]
发表于 2009-08-22 00:32 |只看该作者
现在临时用SEEK的办法.每次都重新打开文件,然后SEEK到上次结尾的地方. 慢了点, 不过凑合着可以用.  

不知道那个EOF到底怎样才能清除掉?

论坛徽章:
0
3 [报告]
发表于 2009-08-24 20:11 |只看该作者

论坛徽章:
0
4 [报告]
发表于 2009-08-24 21:17 |只看该作者
use POE qw(Wheel::FollowTail);

论坛徽章:
0
5 [报告]
发表于 2009-08-25 13:49 |只看该作者
以前写的windows下的tail脚本,用法仿照unix下的tail命令,用来看oracle的日志很方便:tail -f alertX.log

#!/usr/bin/perl
use strict;
use File::Tail;
my($flush,$tail_num,$filename);
my($exec_name)=$0;
&usage() if @ARGV>3 || @ARGV<1;
while(my $arg=shift @ARGV){     #判断命令行参数,-f用来标记刷新读取,-123的数字用来表示从最后的123行开始读取
        if($arg=~/^\-f\s*/){
                $flush=1;
        }
        elsif($arg=~/^\-(\d+)\s*/){
                $tail_num=$1;
        }
        elsif($arg=~/^\-\S*/||$arg=~/^\+\S*/){
                &usage();
        }
        else{
                $filename=$arg;
        }
}
&usage() unless $filename;
$tail_num=10 unless $tail_num;
my($timeout)=1;
die "No filename specified!\n" unless $filename;
unless(-f $filename){
        print STDERR "the file \"$filename\" does NOT exist!\n";
        exit;
};
my $f=File::Tail->new(name=>$filename,maxinterval=>1, tail=>$tail_num);
unless($flush){    如果没有-f参数,直接把结果输出
        print $f->read;
        exit;
}
my ($line,$nfound,$timeleft,$pending);
while (1) {   #如果有-f参数,那么不停的尝试读取文件,采用select的阻塞方式,这样占用资源最小
        ($nfound,$timeleft,$pending)=
                 File::Tail::select(undef,undef,undef,$timeout,$f);
    unless($nfound){
            #warn "timeout for waiting the file,and blocking...\n";
    }
    else{
       print $pending->read;
    }
}

sub usage{
        print "Usage: $exec_name [-f] [-N] filename\n";
        exit;
}

论坛徽章:
0
6 [报告]
发表于 2009-08-25 15:33 |只看该作者
POE++

论坛徽章:
0
7 [报告]
发表于 2009-08-25 16:21 |只看该作者
不知道这个是不是你要的, 实现的很简单, 不是我原创。

open (FD, "< /tmp/test.log") or die $!;
while (1) {
      my $in = <FD>;
      print $in;
}
close FD;

论坛徽章:
0
8 [报告]
发表于 2009-09-15 12:59 |只看该作者
学习了~~~

论坛徽章:
0
9 [报告]
发表于 2009-09-26 21:34 |只看该作者
open(L,"tail -F  $file |");

论坛徽章:
0
10 [报告]
发表于 2009-09-27 07:58 |只看该作者
用 fifo 应该也可以实现。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP