每行文件的Shell命令

时间:2013-04-05 07:54:31

标签: perl shell scripting

我正在尝试编写一个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

2 个答案:

答案 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