web-dev-qa-db-ja.com

find grepとtailを組み合わせる

特定の名前で始まるすべてのファイルを検索し、各ファイルを調べて文字列を含む行を見つけ、文字列を含む各ファイルの最後の行のみを出力します。ステップバイステップで、私は最初に「A123」で始まる自分のディレクトリ内のすべてのファイルを見つけます

find . -name 'A123*'

次に、「トライアル」を含むファイルの各行を取得します

find . -name 'A123*' -exec grep 'Trial' {} \;

そして、ここから最後の行だけを印刷したいのですが、

find . -name 'A123*' -exec grep 'Trial' {} | tail -1 \;

ただし、この最後のコマンドは機能しません。これを修正して、取得しようとしているものを取得するにはどうすればよいですか?

3
Shep Bryan

|はシェル演算子であるため、findの出力全体がtailに渡されます。実行するすべてのコマンドをグループ化してshまたはbash(または任意のシェル)に渡すことにより、execで単一のコマンドのみを実行する必要があります

find . -name 'A123*' -exec bash -c 'grep Trial "$1" | tail -1' grep {} \;

または、他のいくつかの単一のコマンドを使用して、最後の一致を 行パターンの最後の出現をgrepする方法 から取得できます。


ファイルの名前に特殊文字#$/\`&*~-...などの特殊文字が含まれていないことを確認できる場合は、これを使用できます

find . -name 'A123*' -exec bash -c "grep 'Trial' {} | tail -1" \;

ただし、知らない思いがけない名前があった場合、おかしなことが発生することがありますのでご注意ください。詳細については find -exec sh -cを安全に使用できますか? をお読みください

3
phuclv