web-dev-qa-db-ja.com

grepをgrepにパイピングした後の色を保持

grepの後にlsの色付けを保持する に類似した質問がありますが、色付きのgrep出力を別のgrepにパイプすると、色付けが保持されないことに悩まされます。

例としてgrep --color Word * | grep -v AVOIDは、最初の出力の色を保持しません。しかし、私にとってはls | grep FILE色を維持するのはなぜですか?

129
Zitrax

grepは、パイプへの書き込み時などに、カラー出力を無効にすることがあります。 grep --color=alwaysでこの動作をオーバーライドできます

正しいコマンドラインは

grep --color=always Word * | grep -v AVOID

これはかなり冗長です。あるいは、次の行を追加することもできます。

alias cgrep="grep --color=always"

たとえば.bashrcに追加し、cgrepを色付きgrepとして使用します。 grepを再定義すると、grepの特定の出力に依存し、asciiエスケープコードが気に入らないスクリプトで問題が発生する可能性があります。

147

アドバイスの言葉:

grep --color=alwaysを使用すると、次のパイプに渡される実際の文字列が変更されます。これにより、次の状況が発生する可能性があります。

$ grep --color=always -e '1' * | grep -ve '12'
11
12
13

オプション-ve '12'は中央の行を除外する必要がありますが、12の間に色文字があるため除外されません。

72
andersonvom

パイプの最後で同じgrepコマンドを繰り返すだけです。
grep Word * | grep -v AVOID | grep -v AVOID2 | grep Word

8
Alex