次のコマンドを実行した場合
cat * | grep DATABASE
シェルは、Word DATABASE
を含む*ファイル内のすべての行を吐き出します。各行が離れているファイルを吐き出す方法はありますか?
man
によると-H
と言うgrepのprint the filename for each match
オプションを使用しようとしましたが、私のシェルではそれだけです
(standard input):$DATABASE_FUNCTION = dothis();
そのために猫を使用しないでください。代わりに、grep DATABASE *
またはgrep -n DATABASE *
(ファイル名だけでなく行番号も知りたい場合)を直接使用します。
猫の無駄な使用 を参照してください。
もう少し明確にするために:cat *
は実際にすべてのファイルを連結し、パイプを介してそれらをgrepにフィードするため、grepはどのコンテンツがどのファイルに属しているかを知る方法がなく、実際にスキャンしているかどうかさえ知ることができません。ファイルまたはあなたは非常に速くタイプしています。パイプを使用すると、すべてが1つの大きな標準入力ストリームになります。
最後に、検索するファイルが複数ある場合、grepはデフォルトでファイル名を出力するため、-H
はほぼ確実に冗長です。ただし、出力を解析する必要がある場合は、これが役立つ可能性があります。*
グロブが単一のファイルに展開され、grepがその場合にファイル名を省略する可能性があるためです。
grep -H DATABASE *
を使用します(注:ディレクトリに複数のファイルがある場合、-H
はオプションです)。
あなたが抱えている問題は、コマンドでcat *
がすべてのファイルを1つの大きな混乱に連結し、|
がそれをgrep DATABASE
の標準入力に送信することです。 grepがデータを見るときまでに、それがどこから来たのかに関する情報は失われています。解決策は、grepが個々のファイルを調べる作業を行うようにすることです。これにより、一致が見つかると、どのファイルからのものかがわかります。