
grep
あるコマンドの出力を別のコマンドにパイプしていますgrep
。最初はgrep
を使用しているため、最初の一致が色付きになります。実際には、一致が 2 つの色コード、つまりと--color=always
で囲まれていることを意味します。\033[1;31m
\033[0m
ここで問題となるのは、2 番目のパターンが の場合m
、前の一致のカラー コードと一致することです。
echo A B C | grep --color=always A | grep m
同様に、番号31
も一致します。
これを回避する方法はありますか?
アップデート:
言うまでもなく、マッチには色を付ける必要があるだろうと予想していたので、取り除くことは--color=always
私にとって満足のいく解決策ではありません。
答え1
を使用しないでくださいgrep --color=always
。これがまさに、GNU grep
(およびおそらく他のツール) に も用意されている理由です。grep --color=auto
は、 のみと同等ですgrep --color
( よりman grep
)。
--color[=WHEN], --colour[=WHEN]
Surround the matched (non-empty) strings, matching lines,
context lines, file names, line numbers, byte offsets, and
separators (for fields and groups of context lines) with escape
sequences to display them in color on the terminal. The colors
are defined by the environment variable GREP_COLORS. The
deprecated environment variable GREP_COLOR is still supported,
but its setting does not have priority. WHEN is never, always,
or auto.
これについてより詳細に文書化されている場所を見つけることができませんが、基本的には出力がgrep
ファイルか端末かパイプかなどを検出し、それに応じて動作します。
$ echo foo | grep --color=always o | grep m
f[01;31mo[m[01;31mo[m
$ echo foo | grep --color=always o >outfile; grep m outfile
f[01;31mo[m[01;31mo[m
上記を以下と比較
$ echo foo | grep --color o >outfile; grep m outfile
$ echo foo | grep --color o | grep m
$
したがって、このauto
オプションを使用すると、基本的に、色が見えるときだけ色が印刷されます。これは非常に巧妙で、魔法のように機能します。そのため、私は次のものを持っています。
$ type grep
grep is aliased to `grep --color'
答え2
ちなみに、これがまさに、 が ではなく を--color
デフォルトで設定する理由です。--color=auto
--color=always
目標が「との両方を含むすべての行を表示しA
、m
一致するA
とm
文字を強調表示する」である場合、最も簡単な解決策は、すべての一致の後にすべての強調表示を実行し、1 つの egrep を使用して強調表示を戻すことです。次のようになります。
{
echo "A b";
echo "A m";
echo "B m";
echo "Another m";
} | grep 'A' | grep 'm' | egrep --color 'A|m';
答え3
A
実際の使用例は何ですか?を含むすべての行に色分けしたい場合は、m
単にgrep
s を逆にします。
echo A B C | grep m | grep --color=always A
あるいは、元の出力でリテラルを探している場合は、すべての色コードを除外して結果を印刷するm
必要があります。grep m
と色分けされた出力。これを行う 1 つの方法は、 を使用してnl
出力の行に番号を付け、grep
行番号の後に が続く場合はm
、その出力から行番号のみを保存し、 を使用してsed -n
色分けされた出力の行のみを印刷することです。