web-dev-qa-db-ja.com

猫* | grep何か...結果はどのファイルにありますか?

次のコマンドを実行した場合

cat * | grep DATABASE

シェルは、Word DATABASEを含む*ファイル内のすべての行を吐き出します。各行が離れているファイルを吐き出す方法はありますか?

manによると-Hと言うgrepのprint the filename for each matchオプションを使用しようとしましたが、私のシェルではそれだけです

(standard input):$DATABASE_FUNCTION = dothis();
8
Jake Wilson

そのために猫を使用しないでください。代わりに、grep DATABASE *またはgrep -n DATABASE *(ファイル名だけでなく行番号も知りたい場合)を直接使用します。

猫の無駄な使用 を参照してください。

もう少し明確にするために:cat *は実際にすべてのファイルを連結し、パイプを介してそれらをgrepにフィードするため、grepはどのコンテンツがどのファイルに属しているかを知る方法がなく、実際にスキャンしているかどうかさえ知ることができません。ファイルまたはあなたは非常に速くタイプしています。パイプを使用すると、すべてが1つの大きな標準入力ストリームになります。

最後に、検索するファイルが複数ある場合、grepはデフォルトでファイル名を出力するため、-Hはほぼ確実に冗長です。ただし、出力を解析する必要がある場合は、これが役立つ可能性があります。*グロブが単一のファイルに展開され、grepがその場合にファイル名を省略する可能性があるためです。

22
Eduardo Ivanec

grep -H DATABASE *を使用します(注:ディレクトリに複数のファイルがある場合、-Hはオプションです)。

あなたが抱えている問題は、コマンドでcat *がすべてのファイルを1つの大きな混乱に連結し、|がそれをgrep DATABASEの標準入力に送信することです。 grepがデータを見るときまでに、それがどこから来たのかに関する情報は失われています。解決策は、grepが個々のファイルを調べる作業を行うようにすることです。これにより、一致が見つかると、どのファイルからのものかがわかります。

6
Gordon Davisson