在perl中使用egrep并遍历目录

时间:2019-01-23 10:05:55

标签: perl unix

我有一个目录,该目录中有x个子目录,每个子目录中有许多文件和文件夹,在这里我需要grep来输入特定的关键字“ 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 :(得分:3)

您不需要多次运行egrep ...您可以只使用一个egrep来运行它,甚至最好在几行Perl中运行它。

您只需要使用完整路径open,然后对于文件中的每一行(使用<$fh>进行读取)就可以使用正则表达式来查找与{ {1}}到您的输出文件。

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); } 也不是一个好主意,因为它首先会假设您位于正确的起始目录中,但是它也不会“撤消”目录更改,因此将无法继续工作。下一个子目录。

如果要遍历多层子目录,则需要编写一个递归子程序。

答案 1 :(得分:2)

对于您的perl脚本,您没有使用perl的模式匹配功能。无需使用perl,就可以对egrep中的所有内容进行编程。

但是我认为将findegrep结合使用会更容易。

find /nfs/abc -type f -exec egrep -ne 'XYZ' {} /dev/null \;

答案 2 :(得分:0)

由于这里有一个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命令将给出的警告。