perl在IC设计中的应用01: perl提取特定行

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.脚本的使用

  1. 复制三个代码中一个代码,保存到extract.pl文件中
  2. 将extract.pl放置在Linux环境中的一个目录下:
  3. 准备好crm.log文件放在同一个目录下
  4. 在terminal终端中设置执行权限: chmod a+x extract
  5. 在terminal终端中执行命令:extract
  6. 最后得到report.log文件,其中包含crm.log文件相应的Error和Warning信息

 

猜你喜欢

转载自blog.csdn.net/icxiaoge/article/details/81514213
今日推荐