Perl读取特定行
VCS编译会产生log文件,包含了Error、Warning和lint信息,特别是warning和lint的数量比较多,直接在Lint中查找比较麻烦,并且还存在大量我们不关系的Lint信息,此时可以通过Perl将我们关心的包含了Error、Warning和lint信息提取出来,进行查看会方便很多。DC综合都会产生很多log文件,使用Perl提取特定行也会很方便。
1.提取包含关键词的一行
Perl提取特定行具有两种方式:
方法1:每次读取原文件的一行,依次处理
特点:占用内存空间小,适用于大文件
方法2:一开始读取原文件所有内容,再按行依次处理:
特点:占用内存空间大,适用于小文件
方法1:每次读取一行
#!/usr/bin/perl -w
use strict ;
my $eachline ;
my $result;
open (INFILE, "crm.log"); #提取crm.log文件内容
while ($eachline=<INFILE>) {
if ($eachline =~ m/(Error:)|(Warning)/){ #匹配关键词
print $eachline."\n";
$result = $result . $eachline ."\n"; #将匹配行保存在result中
}
}
close(INFILE);
open(OUTFILE, ">report.log");
print OUTFILE ($result); #将result写入到report.log中
方法2:一次读取原文件所有数据
#!/usr/bin/perl
use strict ;
my @array ;
my $string ;
my $result ;
open (INFILE, "crm.log");
@array = <INFILE> ;
foreach $string (@array){
if ($string =~ m/(Error:)|(Warning)/){
print $string."\n";
$result = $result . $string ."\n";
}
}
close(INFILE);
open(OUTFILE, ">outfile");
print OUTFILE ($result);
2.获取匹配行后面的多行
每行含有Error或者Warning则匹配成功,将匹配行在内的连续三行打印并写入文件report.log
#!/usr/bin/perl -w
use strict ;
my $eachline ;
my $result;
my $line_cnt=0;
open (INFILE, "crm.log");
while ($eachline=<INFILE>) {
if ($eachline =~ m/(Error)|(Warning)/){ #匹配 Error或者Warning
$line_cnt = 0;
print $eachline."\n";
$result = $result . $eachline ."\n";
} elsif($line_cnt<3) { # 匹配成功后的连续三行写入report.log,并打印
$line_cnt++ ;
print $eachline."\n";
$result = $result . $eachline ."\n";
}
}
close(INFILE);
open(OUTFILE, ">report.log");
print OUTFILE ($result);
3.脚本的使用
- 复制三个代码中一个代码,保存到extract.pl文件中
- 将extract.pl放置在Linux环境中的一个目录下:
- 准备好crm.log文件放在同一个目录下
- 在terminal终端中设置执行权限: chmod a+x extract
- 在terminal终端中执行命令:extract
- 最后得到report.log文件,其中包含crm.log文件相应的Error和Warning信息