我需要搜索文件然后返回包含的内容,并在搜索字符串之后。上下文正在搜索日志文件,我希望在该日志文件中返回从日期开始的所有消息>最后一次邮票。示例子字符串可能是:" [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"
}
答案 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