execに複数のgrepコマンドを追加してみてください

execに複数のgrepコマンドを追加してみてください

ディレクトリ(およびすべてのサブディレクトリ)のすべてのファイルから文字列を取得しようとしています。ファイルにその文字列がある場合は、他の文字列(この場合は「snake」)が表示される回数を検索して出力したいと思います。また、「蛇」が現れるファイルの行を出力したいと思います。

echo "Files with Reptile:"
find . -type f -name "*.txt" -exec grep -l "Reptile" {} \;

私の課題は、中かっこの後に追加のgrepコマンドを追加する方法です。いくつか試してみましたが、「-exec欠落引数」エラーが発生し続けます。

私はこの発見にあまりにも多くを入れようとしていますか?

ありがとう

答え1

次のことを試すことができます。

$ find . -type f -name "*.txt" -exec sh -c "grep -l "Reptile" {} | xargs -I% grep -Hn snake %" \;
./rep1.txt:2:snake
./rep2.txt:5:another snake

出力にはコロンで区切られたリストが含まれます。ここで、最初の引数はファイル名(引数から-Hgrep、2番目の引数は目的の用語が表示される行番号(引数から-ngrep、3番目の引数は行自体です。

xargs外部に移動でき、find以下を提供します。

$ find . -type f -name "*.txt" -exec grep -l "Reptile" {} \; | xargs -i grep -Hn snake {}

(同じ)-iパラメータは使用されなくなりましたが、便宜上頻繁に使用されます。xargs-I{}

入力ファイル:

$ tail -n+1 rep*.txt
==> rep1.txt <==
Reptile
snake
iguana
crocodile

==> rep2.txt <==
Reptile
alligator
turtle
another snake
komodo dragon

==> rep3.txt <==
Reptile
lizard
gecko

間違ったファイル名を処理する必要がある場合は、xargsをマージして選択するprint0こと-0を検討してください。

答え2

複数の-exec述語。コマンドが成功した場合にのみ該当するため、-exec最初のコマンドに対して特別な作業を行う必要はありませんgrep

find ... -exec grep -q "Reptile" {} \; -exec grep -Hn snake {} \;

答え3

find . -type f -name "*.txt" -exec sh -c 't=$(mktemp)
        for fi
        do
                if grep -q Reptile "$fi"
                then
                        echo "$fi contains Reptile"
                        grep snake "$fi" | tee "$t"
                        echo "snake appeared on $(wc -l < "$t") line(s)"
                fi
        done
        rm -f "$t"
        ' sh {} +

これは、「snake」という単語が含まれていなくても、単語/文字列「Reptile」を含むファイル名を報告し、「snake」を含む行数を独立して報告します。

こういう質問を間違って読んで、必須だと思いました。取り出すのは簡単です。

find . -type f -exec sh -c '
        for fi
        do
                if grep -q Reptile "$fi"
                then
                        echo "$fi contains Reptile"
                        grep snake "$fi"
                fi
        done
        ' sh {} +

必要に応じて-nオプションを追加できます。grep snake

これはほとんどすべての有効なファイル名を処理する必要があります。スペースで始まるか、改行文字を含むファイル名に対する他の答えを確認してください。

関連情報