質問: find grepとtailを組み合わせる 特定の名前で始まるすべてのファイルを検索し、各ファイルを調べて文字列を含む行を見つけ、文字列を含む各ファイルの最後の行のみを出力します。ステップバイステップで、私は最初に「a123」で始まる自分のディレクトリ内のすべてのファイルを見つけますfind . -name 'a123*' 次に、「トライアル」を含むファイルの各行を取得しますfind . -name 'a123*' -exec grep 'trial' {} \; そして、ここから最後の行だけを印刷したいのですが、find . -name 'a123*' -exec grep 'trial' {} | tail -1 \; ただし、この最後のコマンドは機能しません。これを修正して、取得しようとしているものを取得するにはどうすればよいですか?
回答: |はシェル演算子であるため、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を安全に使用できますか? をお読みください