perl linux运行时间,【linux】grep 和【perl】 脚本实现的grep功能的运行时间差异

参考在网上找到的代码,没想到相差那么大,应该是grep比perl的模式匹配更快吧。

[gzhy@nearby stat]$ wc -l 1

234033 1

[gzhy@nearby stat]$ perl 1.pl

cost 1 seconds

zjtel : 32606

[gzhy@nearby stat]$ perl 2.pl

cost 111 seconds

zjtel : 32606

2.pl

#!/usr/bin/perl

my $time=time();

open(file,"1");

while(;)

{

chomp;

if(m/:zjtel:/)

{

$zjtel++;

}

}

close(file);

$time=time()-$time;

print "cost $time seconds\n";

print "zjtel : $zjtel\n"; 1.pl

#!/usr/bin/perl

$time=time();

$count=`grep zjtel 1 | wc -l `;

$time=time()-$time;

print "cost $time seconds\n";

print "zjtel : $count\n":

测试:在一个文件夹下有199个纯文本文件,要扫描265个关键字,分别用pattern-match和grep两种方式进行扫描,统计扫描时间。

结果:均查出6354行。

pattern-match:2173 seconds;

grep1:    888 seconds;

grep2:    193 seconds;

参考代码如下:

pattern-match:

use strict;

use File::Basename;

#在一个目录的文件文件中查找包含关键字的 ::

my ($dir,$keywords)= @ARGV;

my @filenames=glob "$dir*";

open KEY,"

my @keywords=;

close KEY;

my $num_key=scalar @keywords;

my @match_lines;

my $time=time();

foreach my $file(@filenames){

eval{

open FILE,"

};

if($@){

print $@;

next;

}

$n=1;

while my $line(){

chomp $line;

foreach my $key(@keywords){

if($line=~m/$key/){

$context="$file:$n:$line\n";

push @match_lines,$context;

}

}$n++;

}

close(file);

}

open RS,">result_file_pattern";

foreach(@match_lines){

print RS $_;

}

close RS;

$time=time()-$time;

print "Patter-match ($num_key keywords) end:$time seconds\n";

grep1: 分别扫每个keywords

use strict;

use File::Basename;

#在一个目录的文件文件中查找包含关键字的 ::

my ($dir,$keywords)= @ARGV;

my @filename=glob "$dir*";

open KEY,"

my @keywords=;

close KEY;

my $num_key=scalar @keywords;

my @match_lines;

my $time=time();

foreach my $file(@filenames){

foreach $key(@keywords){

chomp $key;

next unless ($key);

my $m_keyword = "\\\|\[\^a-z\]$key\$\|\^$key\[\^a-z\]\|\[\^a-z\]$key\[\^a-z\]";

my @sub_match_lines

eval{

@sub_match_lines=`grep -EnriIHs $m_keyword $file` or die "grep Error:$!"

};

if($@}{

print "$@";

next;

}

push @match_lines,@sub_match_lines;

}

}

open RS,">result_file_grep";

foreach(@match_lines){

print RS $_;

}

close RS;

$time=time()-$time;

print "Grep ($num_key keywords) end : $time seconds\n";

//如果直接将$context print到RS句柄和现在这种方式是否有区别?

grep2: 经265个keywords放在一个匹配字符串中扫描

use strict;

use File::Basename;

my ($dir,$keywords)= @ARGV;

my @filenames=glob "$dir*";

my $num=scalar @filenames;

print $num;

open KEY,"

my $all_keys;

my $i=0;

foreach my $key(){

chomp $key;

next unless($key);

my $m_keyword = "\\\|\[\^a-z\]$key\$\|\^$key\[\^a-z\]\|\[\^a-z\]$key\[\^a-z\]";

if($i==0){

$all_keys.="$m_keyword";

$i=1;

}else{

$all_keys.="\|$m_keyword";

}

}

close KEY;

my @match_lines;

my $time1=time();

foreach my $file(@filenames){

chomp $file;

print $file."\n";

my @sub_match_lines;

eval{

my $grep ="grep -EnriIHs \"$all_keys\" $file";

@sub_match_lines=`$grep` or die "$grep Error:$!";

};

if($@){

print $@;

next;

}

push @match_lines,@sub_match_lines;

}

open RS,">result_file_grep2";

foreach(@match_lines){

print RS $_;

}

close RS;

$time=time()-$time;

print "Grep end:$time\n";

File::Basename模块:

File::Basename - Parse file paths into directory, filename and suffix.

File::Basename中常用的方法有fileparse, basename, dirname。

fileparse方法会传回包含路经名称三个部份的串列。

basename方法传回路经位置。

basename方法传回档案名称。

($name,$path,$suffix) = fileparse($fullname,@suffixlist);

my $filename = fileparse("/foo/bar/baz.txt", qr/\Q.txt\E/);

目录句柄操作:

opendir,readdir,closedir

opendir只能返回目录下文件的不带路径的文件名。

opendir(DIRHANDLE,$dir) or die "Can't open $dir:$!";

my @filenames=sort readdir(DIRHANDLE);

closedir(DIRHANDLE);

Glob:

在shell中会将命令行的文件名模式扩展成所有匹配的文件名,这就成为globbing(文件名匹配模式)。

在Perl中通过glob操作符来实现。

my @all_files=glob "dir/*"  ;#保存dir目录下所有文件名和目录,除了以点号开头的隐藏文件。

如:目录/file/下有a.txt,b.txt,和C文件夹,D文件夹;则glob "/file/*" ;则结果是/file/a.txt ;/file/b.txt;/file/C;/file/D;

等同于my @all_files=;

my @file=;#表示读取文件内容;

my @file_dirs=;#表示glob;

另外linux grep -r或-R可以递归遍历文件目录下的文件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值