我正在尝试编写一个Perl脚本,它将执行以下操作:
1.打开一个文件,在每行中包含多个文件的位置(说文件A,文件B)
2.对每个文件执行egrep,例如egrep“module | input | output”
3.将egrep的输出与相同的文件名A,B等存储在不同的目录中)
egrep有更多限制,但我可以稍后再添加。
我的问题是如何执行第2步和第3步?在哪里,我在我的文件的每一行上执行一个shell命令,该命令由我的Perl脚本打开。例如,文件位置为design/rtl/name.v
,我希望将egrep的结果存储在design/fake/name.v
答案 0 :(得分:2)
在shell(bash)中创建目录结果并将文件列在文件“list”中的一行中,然后直接在bash提示符下输入
for i in `cat list`;do egrep "string" $i > result/grep${i}; done
这在perl中类似。错误行为更好,可能会更快一点:真正的优势是可以更容易地添加额外的行为。将其保存为文件并以“perl script list foo”运行,其中script是脚本的文件名,list是文件列表的文件名,foo是要搜索的模式
#!/usr/bin/perl
#
my ( $file, $pattern ) = @ARGV;
open( my $fh, $file ) || "die $! $file\n";
while (<$fh>) {
chomp; #trim newline from filename
my $togrep = $_;
open( my $grepfh, $togrep ) || warn "$togrep $!";
if ($grepfh) {
open( my $output, ">result/$togrep" ) || die "$togrep $!";
while ( grep( $pattern, <$grepfh> ) ) {
print $output $_;
}
}
}
答案 1 :(得分:1)
循环遍历文件名,如下所示:
while read file
do
egrep "module|imput|ouput" "$file" > "/another/directory/${file##*/}"
done < fileList.txt