【问题标题】:search for text pattern in a directory using perl script使用 perl 脚本在目录中搜索文本模式
【发布时间】:2018-09-24 08:46:37
【问题描述】:

谁能与我分享一个 sn-p,我可以在 perl 文件中进行 grep 搜索。例子, 我需要这个 grep:grep 1115852311 /opt/files/treated/postpaid/*

在 perl 脚本中完成并打印所有匹配项

尝试了以下方法,但没有成功:

my $start_dir= "\opt\files\treated\postpaid\";
my $file_name = "*";
my @filematches;
opendir(DIR, "$start_dir");
@xml_files = grep(1115852311,readdir(DIR));
print @xml_files;

【问题讨论】:

    标签: perl grep


    【解决方案1】:

    阅读the documentation for grep() 是一个好的开始。如果这样做,您会发现 Perl 的 grep() 与 Unix 的 grep 命令的工作方式大不相同。 Unix 命令只是在文件列表中查找文本。 Perl 版本适用于任何数据列表,并返回该列表中任意布尔表达式为真的任何元素。

    Perl 版本的 Unix 命令看起来像这样:

    while (<$some_open_filehandle>) {
      print if /$some_string/;
    }
    

    这不是您想要的,但我们可以从它开始。首先,让我们编写一些文件名和字符串,并检查该字符串是否出现在文件中:

    sub is_string_in_file {
      my ($filename, $string) = @_;
    
      open my $fh, '<', $filename or die "Cannot open file '$filename': $!\n";
    
      return grep { /$string/ } <$fh>;
    }
    

    我们现在可以在使用readdir() 的循环中使用它来获取文件列表。

    my @files;
    
    my $dir = '/opt/files/treated/postpaid/';
    opendir my $dh, $dir or die $!;
    
    while (my $file = readdir($dh)) {
      if (is_string_in_file("$dir$file", 1115852311) {
         push @files, "$dir$file";
      }
    }
    

    运行该代码后,包含您的字符串的文件列表将位于@files

    您可能想查看glob() 而不是opendir()readdir()

    【讨论】:

    • 非常感谢您的意见,它有帮助。我使用下面的 sn-p 并且它有效
    【解决方案2】:

    使用下面的 sn-p 来实现我想要的

    #!/usr/bin/perl
    use strict;
    use warnings;
    
    sub is_string_in_file {
      my ($filename, $string) = @_;
      open my $fh, '<', $filename 
        or die "Cannot open file \n";
    
    
    while(my $line = <$fh>){
      if($line =~ /$string/){
        print $string;
        print $filename."\n";
      } 
    }
      #return grep { $_ eq $string } <$fh>;
    }
    
    my @files;
    
    my $dir = '/opt/files/treated/postpaid/';
    opendir my $dh, $dir or die $!;
    
    while (my $file = readdir($dh)) {
        is_string_in_file("$dir$file", 1115852311);
    }
    

    【讨论】:

    • 我已经更改了我的is_string_in_file() 子例程以使用正则表达式检查,而不是我之前使用的(相当天真的)字符串比较。我想你会发现is_string_in_file() 子例程会更加灵活,如果你让它返回一个布尔标志(就像我的版本一样)并处理你想要在它之外的任何打印。
    猜你喜欢
    • 1970-01-01
    • 2022-07-31
    • 2013-04-10
    • 1970-01-01
    • 1970-01-01
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    • 2017-09-29
    相关资源
    最近更新 更多