marvel
请教一个用tail -f 作为管道输入的问题
要用perl实现如下功能
实时跟踪某一日志文件, 当文件中有符合标准的纪录出现, 将其按照固定格式转化成容易阅读的方式打印在屏幕上
当我用"tail -f $filename |"作为管道的输入时, 发现并不是所有符合标准的纪录都会被打印出来, 尤其是有连续多条符合标准的纪录同时出现时
以下是程序的简化版, 猜测是tail -f 的缓存的问题, 但没有头绪如何解决, 求高手指点,谢谢:em03:
#!/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(<PHANDLE>)
{
my $bps_log=<PHANDLE>;
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]);
}
marvel
回复 #1 marvel 的帖子
搞定了
把所有的变量都打印出来,
发现如果my $bps_log=<PHANDLE>;
处理是读一行跳过一行, 因此会丢掉一些纪录
把值设置成my $bps_log=$_; 就可以了
但是还是不是很理解为什么是这么处理, 继续请高手指教