如何使用File :: Tail从同一目录中读取多个文件?

时间:2011-03-21 16:33:43

标签: perl

我正在编写一个程序来读取IDS系统中的规则和日志文件。 我在Perl中使用File :: Tail函数 无法弄清楚如何使用它。 以下是我的一些例子......

示例1

#!/usr/local/bin/perl
use Fail::tail;

opendir RUL, "/etc/snort/rules" || die "Could not open RUL directory\n $!";

my @allrule = grep {/.rules$/} readdir RUL;
close RUL;

   foreach my $rulefile (@allrule)
   {
      open(LF, "/etc/snort/rules/$rulefile") or die "$!";
      while(<LF>)

       print "$\n";
   }

通过这个例子,我可以打印终端上的所有规则...... 如何使用file :: tail函数更改规则,甚至将所有规则写入新文件?

我试过了:

Example 2
#!/user/local/bin/perl
.
.
.
foreach my $rulefile(@allfule)
{
   $file = File::Tail->new("/etc/snort/rules/$rulefile");
   while (defined(my $line = $file -> read))
   {
       print $line;
   }
}

示例2不会运行。 任何人都有任何关于它为什么不运行的想法?

3 个答案:

答案 0 :(得分:4)

我没有使用过File :: Tail,但基于它的CPAN文档和你看到的行为看起来就像你开始拖尾你的数组中的第一个文件一样,它会一直等到你停止拖尾那个文件

查看usage of select with File::Tail from CPAN

看起来你基本上需要使用File :: Tail :: select并将File :: Tail对象的数组传递给它以及你需要的任何其他基本逻辑,当然,例如示例中显示的循环等等。

答案 1 :(得分:0)

将其写入文件:

open(my $outfile, ">/path/to/someoutfile") or die $!; # use >> if you want to append instead of overwrite
foreach my $rulefile(@allfule)
{
   $file = File::Tail->new("/etc/snort/rules/$rulefile");
   while (defined(my $line = $file->read))
   {
       print $outfile $line;
   }
}
close($outfile);

希望能帮到您解决眼前的问题。我有一种感觉,有更好的方法,但我不确定你想要完成什么。对于日志Fail::Tail有意义,但(我假设)规则文件是静态的,因此Fail::Tail似乎是不必要的。

答案 2 :(得分:0)

我猜你的意思是File :: Tail? (我在CPAN上找不到Fail :: Tail)。

File::Tail处的文档说:

  

     

read从输入中返回一行   文件。如果没有准备就绪,那就行了   阻止直到有。

所以你的循环永远不会可靠地完成。我之前从未查看过File :: Tail,但我你需要注意它的位置

  

NOWAIT

     

不会阻止读取,但如果存在则返回空字符串   无需阅读。不要使用这个   除非你知道你在做什么。如果   你在循环中使用它,你   可能不知道你是什么   这样做。如果你想从中读取尾巴   多个文件,请使用select。