поиск текстового шаблона в каталоге с использованием сценария perl - PullRequest
0 голосов
/ 24 сентября 2018

Может кто-нибудь поделиться со мной фрагментом, где я могу выполнить поиск grep в perl-файле.Например, мне нужно, чтобы этот 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 голосов
/ 24 сентября 2018

использовал приведенный ниже фрагмент, чтобы достичь того, что я хотел

#!/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);
}
0 голосов
/ 24 сентября 2018

Хорошим началом было бы прочитать документацию для 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().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...