perl抓取部分文件后包括搜索字符串:

时间:2014-10-15 21:39:20

标签: perl substring

我需要搜索文件然后返回包含的内容,并在搜索字符串之后。上下文正在搜索日志文件,我希望在该日志文件中返回从日期开始的所有消息>最后一次邮票。示例子字符串可能是:" [Mon Oct 13 20:11:32 2014]"。

我已经打开了一个日志文件,将其写入另一个文件。现在我想将第二个文件减少为包含在子字符串之后的部分。

我见过许多复杂的正则表达式等等,并且对Perl不熟悉,我想知道它是否只是我,还是一个盯着我的答案?任何简单的事情都会非常感激!

这是我到目前为止所拥有的:

open(FILE, "/opt/workid/logs/error_log") or die "ERROR:cannot open file $!";
open(FILE2, "/opt/workid/logs/output.txt") or die "ERROR:canont open file $!";
if ( /\Q[Mon Oct 13 20:11:32 2014]\E/ ) {
    $var = 1
} if ( $var ) {
    print "/opt/workid/logs/error_log" > "/opt/workid/logs/output.txt"
}

2 个答案:

答案 0 :(得分:1)

您的代码存在的一个问题是这种语法:

print "/opt/workid/logs/error_log" > "/opt/workid/logs/output.txt"

这在Perl中无效。您还想使用open的3参数形式和词法文件句柄。我将您的代码放入未经测试的脚本中并进行了一些修改。

#!/usr/bin/perl
use strict;
use warnings;
open(my $err_fh, '<', "/opt/workid/logs/error_log") or die "ERROR:cannot open file $!"; # open file for reading
open(my $out_fh, '>', "/opt/workid/logs/output.txt") or die "ERROR:cannot open file $!"; # open file for writing
my $var = 0;
while ( <$err_fh> ) { # go through the error log line by line
    if ( /\Q[Mon Oct 13 20:11:32 2014]\E/ ) { # found the timestamp.
        $var = 1;
    }
    if ( $var ) { # print everything after finding the timestamp
        print $out_fh $_;
    }
}

使用以下命令运行:

perl script.pl

如果有任何问题,请告诉我!

答案 1 :(得分:0)

这是我将采取的方法的伪代码大纲

open log file for input
open search results file for output
copy_contents = 0

loop over all lines in your log file
   if not copy_contents and time_stamp found
       copy_contents = 1

   if copy_conents
       copy current line to search results file
end loop
close files