如何在Perl中实现bash grep递归搜索统计匹配行数的功能
Perl 实现递归搜索统计匹配行数方案
单行命令版本(无需额外编写脚本)
直接输出匹配总行数
替换代码中的搜索关键词和目标目录即可直接得到统计结果:
perl -MFile::Find -e '$count=0;find(sub{return if !-f;open my $fh,"<",$_ or return;$count += grep {/搜索关键词/} <$fh>},"目标目录");print $count."\n"'
对应你的示例场景,执行:
perl -MFile::Find -e '$count=0;find(sub{return if !-f;open my $fh,"<",$_ or return;$count += grep {/big/} <$fh>},"/tmp");print $count."\n"'
直接输出3。
输出匹配行内容(支持管道wc统计)
如果你需要完全复刻grep -r的输出格式,方便后续接其他命令处理,使用:
perl -MFile::Find -e 'find(sub{return if !-f;open my $fh,"<",$_ or return;while(<$fh>){print "$File::Find::name:$_" if /搜索关键词/}},"目标目录")'
对应示例执行:
perl -MFile::Find -e 'find(sub{return if !-f;open my $fh,"<",$_ or return;while(<$fh>){print "$File::Find::name:$_" if /big/}},"/tmp")' | wc -l
输出3。
可复用脚本版本(支持参数调用)
将以下代码保存为perl_grep.pl:
#!/usr/bin/perl use strict; use warnings; use File::Find; # 参数校验 if (@ARGV < 2 || ($ARGV[0] eq '-r' && @ARGV <3)) { die "用法:$0 [-r] 搜索关键词 目标目录\n"; } my ($recursive, $pattern, $dir); if ($ARGV[0] eq '-r') { $recursive = 1; $pattern = qr/$ARGV[1]/; $dir = $ARGV[2] // '.'; } else { $pattern = qr/$ARGV[0]/; $dir = $ARGV[1] // '.'; } find(sub { return unless -f $_; open my $fh, '<', $_ or do { warn "跳过不可读文件 $File::Find::name: $!\n"; return; }; while (<$fh>) { print "$File::Find::name:$_" if /$pattern/; } close $fh; }, $dir);
赋予执行权限后使用方式和原生grep一致:
chmod +x perl_grep.pl ./perl_grep.pl -r "big" /tmp | wc -l # 输出 3
内容的提问来源于stack exchange,提问作者urie
相关产品推荐
相关产品推荐

