需求:perl 脚本动态的获取配置文件,将有exception的异常大文件in.log 抓取exception异常出来写入一个小文件out.log中
问题:perl操作一个config.ini文件读取配置infilepath和outfilepath,perl脚本一直报找不到can not find file or dirctionary
perl代码如下:
#!/usr/bin/perl -W
use strict;
use warnings;
my $configpath = "D:/Users/KONGJUNLONG280/workspace/PerlLog/config.ini";
my $infilepath = "";
my $outfilepath = "";
my $findkey = "JobExecutionException,NullPointerException,ClassCastException,SQLIntegrityConstraintViolationException,NullPointerException,ClassCastException,IllegalArgumentException,ArithmeticException,ArrayStoreException,IndexOutOfBoundsException,NegativeArraySizeException,NumberFormatException,SecurityException,UnsupportedOperationException";
our $system_name = "";
my @findkeyArray;
my $lineFlag =0;
my $i=0;
my $temp="";
my $session="config";
my $configinfilepath="infilepath";
my $configoutfilepath="outfilepath";
my $flag=0;
my $k;
my $t=1;
eval{
open(CONFIG,"<",$configpath)||die "cannot open the file: $!\n";
my @linelist=<CONFIG>;
close CONFIG;
foreach my $eachline(@linelist){
#print $eachline;
$i = 0;
$lineFlag = 0;
$temp=0;
if (my ($k,$v) = $eachline =~ /(\w+)=(.*)/){
if($k eq $configinfilepath){
print "$k ......$v\n";
$infilepath = $v;
}
if($k eq $configoutfilepath){
print "$k ......$v\n";
$outfilepath = $v;
}
}
if($t%3==0 && $t != 1){
#print "one session\n";
#查询数据记录
@findkeyArray=split(/,/,$findkey);
eval{
open(FILE,"<",$infilepath)||die "cannot open the filepath: $!\n";
};
if ($@ ne ''){
print "error >> ".$@."\n";
}
while (my $line =<FILE>){
print "scan row ".$i."\n";
for my $key (@findkeyArray) {
if($line =~ /$key/g){
$lineFlag = $i;
}
}
if($i<($lineFlag+5) && $i>5){
$temp = $temp.$line;
}
elsif($i==($lineFlag+5))
{
#wirte a file
open(FH, ">>",$outfilepath) or die $!;
print FH "$temp\n";#向文件写入内容
close(FH);
}
else{
$temp ="";
}
$i = $i + 1;
}
close FILE;
}
$t = $t + 1;
}
};
if ($@ ne ''){
die "error -->> ".$@."\n";
}
config.ini文件如下:
[config1]
infilepath=/workspace/PerlLog/Logs/pcms.log
outfilepath=/workspace/PerlLog/Logs/out1.log
[config2]
infilepath=/workspace/PerlLog/Logs/pcms.log
outfilepath=/workspace/PerlLog/Logs/out2.log
[config3]
infilepath=/workspace/PerlLog/Logs/pcms.log
outfilepath=/workspace/PerlLog/Logs/out3.log
发现问题:
-rw-r--r-- 1 oracle usr01 1596 Sep 14 12:22 out1.log
-rw-r--r-- 1 oracle usr01 798 Sep 14 12:19 out1.log?
文件后面有?号,怎么会这样?肯定是文件格式不对了?config.ini里面明明是out1.log
解决方案:
参考:http://blog.csdn.net/love__coder/article/details/7693390顶
难道是文件格式兼容性问题?用vim打开该sh文件,输入:
回车,显示fileformat=dos,重新设置下文件格式:
保存退出:
再执行,竟然可以了。这个事情又给我提了次醒,程序尽量在linux下编写,迁移时,也许会少很多问题。
vim的用法,可以参阅以前的blog:vim 常用命令