我有一个目录,该目录中有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` ;
}
答案 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
中的所有内容进行编程。
但是我认为将find
与egrep
结合使用会更容易。
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命令将给出的警告。