web-dev-qa-db-ja.com

パイプがgrepに見つかったときに、grepの一致の強調表示を保持するにはどうすればよいですか?

grep foo bar.txtを実行すると、grepはbar.txtで出現する「foo」をそれぞれ強調表示します。しかし、findを使用して、grepが検索するファイルを判別したい場合があります。だから私はこのようなことをします:

find . -iname "*.abc" | xargs grep foo

またはこれ:

find . -iname "*.abc" -exec grep foo {} \;

どちらの場合も、grepは指定されたファイルで「foo」の出現を正しく検出しますが、出力には強調表示がまったくありません。

findを使用して、ハイライトを失うことなく検索するgrepのファイルを選択するにはどうすればよいですか?

Ubuntu 12.04でGnomeターミナル3.4.1.1を実行しており、シェルとしてbashを使用しています。

4
Matthew

どちらのコマンドでも、問題はgrepではなく、別のコマンドが実際の出力を生成することです(それぞれ、xargsfind)。

これを解決するには、ファイル名ごとにgrepを直接呼び出します。

_IFS=$'\n'
for FILE in $(find . -iname "*.abc"); do
    grep foo $FILE
done
unset IFS
_

またはワンライナーとして:

_IFS=$'\n';for FILE in $(find . -iname "*.abc");do grep foo $FILE;done;unset IFS
_

使い方:

  • _IFS=$'\n'_は、内部フィールド区切り文字を改行文字に設定します(または、ファイル名のスペースによって問題が発生します)。

  • for FILE in $(COMMAND); do COMMANDS doneは、COMMANDで指定されたファイルをループし、変数FILEを現在のファイルに設定し、COMMANDSを実行します。

  • _grep foo $FILE_は_$FILE_でfooを検索し、結果を直接画面に送信します。

  • _unset IFS_は、内部フィールドセパレータをデフォルト値に戻します(スクリプトでは必要ありません)。

4
Dennis

出力をもう一度grepして、色を付けます。

私はここで同様のことをしました: grepから一致に関する追加データを取得します

3
Der Hochstapler