2016-10-07 10 views
1

unixの正規表現をPerl言語に翻訳して、特定の条件に関連する特定のファイルを取得したいとします。Perlの正規表現がすべてのディレクトリをループして特定のファイルを取得する

私はディレクトリ/nfs/cs/test_case/y2016のcall totalResult.plにPerlスクリプトを持っているとします。このディレクトリには、testWeek1、testWeek2、testWeek3 ...などのディレクトリもたくさんあります。各ディレクトリには、testCase1、testCase2、testCase3 ...などのサブディレクトリがあります。各testCaseディレクトリにはファイル呼び出し.test_resultが含まれ、結果を成功または失敗として記録します。

だから私は、たとえば、UNIXコマンドを使用してファイル情報を取得することができます。

wc /nfs/cs/test_case/y2016/testWeek1/testCase1/.test_result 

失敗で各ディレクトリおよびサブディレクトリのtest_resultsを取得したい場合、私は現在からそれを行うことができますそれは私の出力が得られます

grep -ri "fail" */*/.test_result 

:UNIXでのパス/nfs/cs/test_case/y2016よう

/nfs/cs/test_case/y2016/testWeek1/testCase1/.test_result:fail 
/nfs/cs/test_case/y2016/testWeek3/testCase45/.test_result:fail 
/nfs/cs/test_case/y2016/testWeek4/testCase12/.test_result:fail 
. 
. 
...etc 

どのようにしてPerlスクリプトを書くだけで実現できますか?perl testCase.plのコマンドを実行して、同じ出力を得ることができますか?私はUnixとPerlで新しいです、誰も助けることができますか?

答えて

3
# Collect names of all test files 
my @TestFiles = glob('/nfs/cs/test_case/y2016/*/*/.test_result'); 
# Check test files for "fail" 
foreach my $TestFile (@TestFiles) { 
    open(my $T,'<',$TestFile) or die "Can't open < $TestFile: $!"; 
    while(<$T>){ 
    if(/fail/) { 
     chomp; 
     print $TestFile,":",$_,"\n"; 
    } 
    } 
    close($T); 
} 
+0

助けてくれてありがとう、それは仕事です、私はグロブとチャンプの使用は何ですか? – helloworld1234

+0

globは、*がワイルドカードのパターンからファイルをリストア(ファイルのリストを作成)します。 chompは行の終わりから改行を削除します(そこには何もありません) – MERM

+0

私はchompを使って、 "\ n"で終わる行と同じ行を処理します。 "\ n"なし。 – AnFi

0

また、back tick( `)演算子を使用してPerl内で同じlinuxコマンドを実行することもできます。

@ result = `grep -ri" fail "*/* /。test_result`;

print @result;

関連する問題