2016-04-27 12 views
1

シナリオ:フォルダ内に複数のファイルがあり、特定のファイルセットを見つけようとしています。特定のファイルに特定の情報がある場合は、その情報をgrepする必要があります。オプションを使用してfindコマンド内のif条件を使用する方法はありますか?

例:

find /abc/test \(-type f -name 'tst*.txt' -mtime -1 \) -exec grep -Po '(?<type1).*(?=type1|(?<=type2).*(?=type2)' {} \; 

私はあなたが-execを使用することができます

if grep -q 'case=1' <filename>; then 
    grep -Po '(?<type1).*(?=type1|(?<=type2).*(?=type2)' 
fi 

おかげ

+0

したがって、各ファイルを個別に処理する必要がありますか? – Jens

答えて

5

(grepのが本当であるならば、上記印刷)-exec条件と一緒に発見した場合含める必要がfindに条件として - コマンドが正常終了コードを返す場合、ファイルは一致します。だから、書くことができます:find

find /abc/test -type f -name 'tst*.txt' -mtime -1 -exec grep -q 'case=1' {} \; -exec grep -Po '(?<type1).*(?=type1|(?<=type2).*(?=type2)' {} \; 

試験は、左から右に評価されているので、最初の1が成功した場合は、2番目のgrepにのみ実行されます。

状況がさらに複雑な場合は、シェルコード全体をスクリプトに入れて、-execでスクリプトを実行できます。例えば。

#!/bin/sh 
if grep -q 'case=1' "$1"; then 
    grep -Po '(?<type1).*(?=type1|(?<=type2).*(?=type2)' "$1"; 
fi 

してから実行します:myscript.shでこれを入れ

find /abc/test -type f -name 'tst*.txt' -mtime -1 -exec ./myscript.sh {} \; 
+1

シェルスクリプトで '' $ @ "'を繰り返し処理すると、 '-exec ./myscript {} +'を使用して呼び出し回数を減らすことができます。 2つのエグゼクティブアプローチの右側でも同じことができます。 –

+0

ええ、私は答えを簡単にしています。 – Barmar

0

あなたはgrepでPCREオプション-Pを使用しているので、あなたが先読みを使用して、同様1 grepに両方の検索を組み合わせることができます。

find /abc/test -type f -name 'tst*.txt' -mtime -1 -exec grep -Po '(?=.*case=1).*\K((?<=type1).*(?=type1)|(?<=type2).*(?=type2))' {} + 

btwあなたの質問に表示される正規表現は無効です。ここで修正しようとしています。

関連する問題