Может ли кто-нибудь поделиться со мной фрагментом, в котором я могу выполнить поиск 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;
0
Ps-kl 24 Сен 2018 в 11:46

2 ответа

Лучший ответ

Для начала было бы неплохо прочитать документацию по grep(). Если вы это сделаете, вы увидите, что Perl grep() работает несколько иначе, чем Unix-команда grep. Команда Unix просто ищет текст в списке файлов. Версия Perl работает с любым списком данных и возвращает любые элементы в этом списке, для которых истинно произвольное логическое выражение.

Версия команды Unix для Perl будет выглядеть примерно так:

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

3
Dave Cross 24 Сен 2018 в 10:27

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

#!/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);
}
1
Ps-kl 25 Сен 2018 в 08:12