Perl脚本读取最新的日志文件

时间:2012-08-22 13:20:21

标签: perl

我正在尝试组装一个脚本,该脚本将首先识别在文件夹下创建的最新日志文件,然后打开它并查找特定数据。基本上,我将查看此日志文件中的特定错误并将错误打印到新的日志文件中。

我了解如何执行排序以获取最新文件,但无法读取最新文件并将其复制到新日志文件

use File::stat;

$dirname  = 'C:/Luntbuild_Logs';
$timediff = 0;

opendir DIR, "$dirname";

while ( defined( $file = readdir(DIR) ) ) {
    if ( $file ne "." && $file ne ".." ) {
        $diff = time() - stat("$dirname/$file")->mtime;
        if ( $timediff == 0 ) {
            $timediff = $diff;
            $newest   = $file;
        }
        if ( $diff < $timediff ) {
            $timediff = $diff;
            $newest   = $file;
        }
    }
}

print $newest;

$file1 = "$dirname/$file";

open( FILE1, "<$newest" );
my (@fprint) = <FILE1>;
close FILE1;

open( FOUT, ">list1.txt" ) || die("Cannot Open File");

foreach $line (@fprint) {
    print "$line" if $line =~ /> @/;
    print "$line" if $line =~ /ORA-/;
    print FOUT $line;
}

close FOUT;

2 个答案:

答案 0 :(得分:2)

看起来你的错误可能就在这里:

open(FILE1,"<$newest");

您尝试打开没有包含路径的文件(readdir仅返回文件名),这可能有效,也可能无效,具体取决于您当前的工作目录。

由于您没有检查open语句的返回值,因此您不知道它是否失败。最有可能的是,您需要执行以下操作:

open FILE1, "<", "$dirname/$newest" or die $!;

始终检查所有openopendir来电的返回值,因为它们可能会无声地失败。并且一定要包括:

use strict;
use warnings;

在您的脚本中,更正错误和警告。这是您最安全的预防措施,以防止难以发现错误。

答案 1 :(得分:2)

主要问题是您在$file1中构建完整文件路径,但随后打开仅包含文件名的$newest

你真的应该通过

改进你的代码
  • 始终在程序开始时使用use strictuse warnings,并在定义时使用my声明所有变量

  • 使用词法文件和目录句柄以及打开的三参数形式。始终测试开放状态并将$!放在die字符串中,以便您知道 失败的原因

  • 永远不要在变量周围添加双引号,除非你知道它的作用,这就是你想要的

以下是对您的代码的重构,它遵循这些指南,并使用内置的-M运算符来返回文件的年龄(

use strict;
use warnings;

my $dirname = 'C:/Luntbuild_Logs';
my ($newest_age, $newest_file);

opendir my $dh, $dirname or die $!;

while ( readdir($dh) ) {
  my $file = "$dirname/$_";
  next unless -f $file;
  my $age = -M $file;
  unless (defined $newest_age and $newest_age <= $age) {
    $newest_age = $age;
    $newest_file = $file;
  }
}

print $newest_file, "\n";

open my $out,'>', 'list1.txt' or die "Cannot open file: $!";

open my $in, '<', $newest_file or die $!;
while (<$in>) {
  print if /> \@/ or /ORA-/;
  print { $out } $_;
}

close $out or die $!;
close $in or die $!;