grepをgrepにパイピングした後にカラーリングを保持する


140

Grep 後のlsカラーリングの保持に同様の質問がありますが、色付きのgrep出力を別のgrepにパイプすると、カラーリングが保持されないことに不快です。

例として、grep --color WORD * | grep -v AVOID最初の出力の色は保持されません。しかし、私ls | grep FILEは色を保持しますが、なぜ違いがあるのですか?


2
この質問は、Unixコマンドの使用に関するものであり、unix.stackexchange.com
Raptor

回答:


162

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

正しいコマンドラインは

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

これはかなり冗長ですが、代わりに次の行を追加することもできます

alias cgrep="grep --color=always"

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


4
このソリューションは、特定の幸運な状況でのみ機能します。以下のアンダーソンヴォムの回答を参照してください。
studog 2018年

私の場合(Ubuntu)は既にのエイリアスgrepでした。alias grep='grep --color=autoだから私~/.bashrcはそれが最初に定義された場所を変更する必要があるだけです。
sobi3ch

私にとっては機能しません-このシナリオと同様にstackoverflow.com/a/7640077/248616
Nam G VU

この素晴らしいクリエイティブなアイデアは、シンプルで実用的なものです。stackoverflow.com/ a / 36288791/248616
Nam G VU

問題は、2番目のgrepが最初のgrepの色を抑制しないようにする方法についてです。これはその答えではありません。
johannes_lalala

74

アドバイスの一言:

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

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

オプションにもかかわらず-ve '12'、中央の行を除外する必要があり、それは間の色の文字があるないので、1とは2


を使用する場合は--color=auto、どこか他の場所にパイプしているという事実を認識し、色を完全に抑制する必要がありますが、目的を達成できません。それでも色付きの結果が必要な場合は、最後のパイプでを使用して再度grepできると思います--color
andersonvom 2015

2
Mac OS Xでは、@ andersonvomが示唆しているように、少なくとも最後のパイプのカラーリングは機能しません。理由はわからない。除外されたパターンを着色している​​のでしょうか?--color=always私は、上記の警告で動作すると思います。
user766353 2015

3
式では同じgrepパターンを2回使用する必要があります。私はこれをMacでテストしました:http
andersonvom

9

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


2
コマンドを逆にしても同じ結果が得られませんか?grep -v AVOID * | grep WORD
Brydon Gibson

@BrydonGibsonおそらく、パイプラインコマンドの数に関係なく機能することを示す例でした
Alex
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.