You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 04:36:02