使用perl脚本在目录中搜索文本模式

时间:2018-09-24 08:46:37

标签: perl grep

谁能和我分享一个片段,我可以在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;

2 个答案:

答案 0 :(得分:3)

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

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()

答案 1 :(得分:1)

使用以下代码段实现我想要的

#!/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);
}