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