免费注册 查看新帖 |

Chinaunix

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

请教一个用tail -f 作为管道输入的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-03 16:13 |只看该作者 |倒序浏览
要用perl实现如下功能
实时跟踪某一日志文件, 当文件中有符合标准的纪录出现, 将其按照固定格式转化成容易阅读的方式打印在屏幕上

当我用"tail -f $filename |"作为管道的输入时, 发现并不是所有符合标准的纪录都会被打印出来, 尤其是有连续多条符合标准的纪录同时出现时

以下是程序的简化版, 猜测是tail -f 的缓存的问题, 但没有头绪如何解决, 求高手指点,谢谢
#!/usr/bin/perl -w
use strict;
sub print_bps($)
{
    my $filename=shift;
    open(PHANDLE,"tail -f $filename |" ||die "Can not open pipe for reading:!$\n";
        while(<HANDLE>
        {
            my $bps_log=<HANDLE>;
            if($bps_log=~/TCHMQTransport\:\sReceived\sUpStream\stransport\sMQ\sMessage\s\=DATA/)
            {
                my @BPS_tmp=split(/=/,$bps_log);
                my $len=$BPS_tmp[1];
             chomp($len);
            if(length($len)==2060)
            {
                print "$len\n";
            }
       elsif(length($len)==2260)
       {
                print "$len\n";
            }
   }
  }
   close(PHANDLE)||warn "pipe to more failed: !$\n";
       
}

if($#ARGV!=0)
{
   die ("Usage: parse_bps.pl filename\n e.g parse_bps.pl BPS.log\n";
}

else
{
   print_bps($ARGV[0]);

}

论坛徽章:
0
2 [报告]
发表于 2008-07-03 17:43 |只看该作者
如果不是一定要用tail -f的话, File::Tail应该是没问题的.

论坛徽章:
0
3 [报告]
发表于 2008-07-03 18:06 |只看该作者

回复 #1 marvel 的帖子

搞定了

把所有的变量都打印出来,
发现如果my $bps_log=<PHANDLE>;
处理是读一行跳过一行, 因此会丢掉一些纪录

把值设置成my $bps_log=$_; 就可以了

但是还是不是很理解为什么是这么处理, 继续请高手指教

论坛徽章:
0
4 [报告]
发表于 2008-07-04 10:41 |只看该作者
在while的条件里<PHANDLE>读了一行,再用my $bps_log=<PHANDLE>;又读了一行,当然会读一行跳过一行了。

论坛徽章:
0
5 [报告]
发表于 2008-07-04 11:14 |只看该作者

回复 #4 ocean390 的帖子

收到了.. 多谢~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP