используя egrep в perl и путешествовать по каталогам - PullRequest
0 голосов
/ 23 января 2019

У меня есть каталог, и внутри этого каталога у меня есть x подкаталоги, и внутри каждого подкаталога у меня есть много файлов и папок, здесь мне нужно выполнить поиск по определенному ключевому слову, скажем «XYZ», и поместить результаты в текстовый файл с полный путь.

Как я могу открыть каждый файл в подкаталоге (я не знаю имени файла, так как я клонирую из git) и найти конкретное ключевое слово.

А ниже приведен снимок моего кода я использую команду egrep, но здесь я не получаю полный путь (полный путь должен быть (/ dir / sub / file /)

, так как я новичок в кодировании, мне нужно немного информации. спасибо

$path1="/nfs/pais/abh/pgm4.txt";

foreach my $file ( glob('/nfs/abc/*') )

{
        if(-d $file){
        chdir ("$file") or die "cannot change";
    print(cwd); my $cmd = "egrep -nre 'Non' *.*  ";
    `egrep -nre 'nemu' *.* >> $path1` ;
    `egrep -nre 'ELATION' *.* >> $path1` ;
    `egrep -nre 'EULATION' *.* >> $path1` ;


}

Ответы [ 3 ]

0 голосов
/ 23 января 2019

Вам не нужно запускать egrep несколько раз ... вы можете просто сделать это с одним egrep или, что еще лучше, сделать это за пару строк Perl.

Вам просто нужно open файл, используя полный путь, а затем для каждой строки в файле (читайте, используя <$fh>), вы можете использовать регулярное выражение, чтобы найти строки, которые соответствуют, и print их для ваш выходной файл.

open(my $output,">","/nfs/pais/abh/pgm4.txt") || die;

if(open(my $fh,"<","/net/abc/$file"))
  {
  while(<$fh>)
    {
    if( /Nonemu|EMULATION|INTEL_EMULATION/)
      {
      print $output $_;
      }
    }
  close($fh);
  }

Также не рекомендуется использовать chdir подобным образом, так как сначала предполагается, что вы находитесь в правильном начальном каталоге, но это также не «отменяет» изменение каталога, поэтому не сможет работать на следующем подкаталог.

Если вы хотите пересечь несколько слоев подкаталогов, вам нужно написать рекурсивную подпрограмму (подпрограмму).

0 голосов
/ 26 января 2019

Поскольку здесь есть тег perl, я решил дать ответ perl:

#!/usr/bin/perl

use strict;
use warnings;

use File::Find;

sub file_check {
    open my $FH, '<', $_ or return;
    while (<$FH>) {
        if (/Non|nemu|EU?LATION/) {
            print "$File::Find::name: $_";
        }
    }
    close $FH;
}

my $path1 = "/nfs/pais/abh/pgm4.txt";
open my $OUT, '>', $path1
or die "$0: cannot write to $path1: $!\n";

File::Find::find(\&file_check </nfs/abc/*>);

Это, по общему признанию, молчание об ошибках каталога изменений, вместо того, чтобы выдавать фатальную ошибку без контекста. File :: Find на самом деле не предоставляет ловушку для этого или даже для выдачи предупреждений, которые выдаст команда unix find.

0 голосов
/ 23 января 2019

С вашим скриптом perl вы не используете perl возможности сопоставления с образцом.Можно было бы запрограммировать все в perl без использования egrep.

Но я думаю, что проще использовать find в сочетании с egrep.

find /nfs/abc -type f -exec egrep -ne 'XYZ' {} /dev/null \;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...