如何使用 grep 输入保留颜色代码?

Chr*_*048 17 shell grep colors

如果我使用两个连续的grep命令,例如:

echo "foo bar" | grep foo | grep bar
Run Code Online (Sandbox Code Playgroud)

然后不突出显示第一个模式(“foo”)。事实上,grep 似乎从其输入中删除了颜色代码。有什么办法可以防止这种情况吗?

Run*_*ium 27

使用--color=always.

grep检测输出是否到管道(或文件)。当输出到文件时,你最不想要颜色——因为这是终端的转义序列。通常:

foo ^[[01;31m^[[Kbar^[[m^[[K
Run Code Online (Sandbox Code Playgroud)

来自例如:

grep pattern file > result
Run Code Online (Sandbox Code Playgroud)

要覆盖使用--color=always.

grep --color=always pattern file | ...
Run Code Online (Sandbox Code Playgroud)

例子:

有档案:

ID=111;Year=2013;foo=bar
ID=222;Year=2013;foo=baz
Run Code Online (Sandbox Code Playgroud)

然后

grep --color=always ID file | grep --color=always 2013 | grep foo
Run Code Online (Sandbox Code Playgroud)

将颜色ID2013foo

grep --color=always ID file | grep 2013 | grep foo
Run Code Online (Sandbox Code Playgroud)

将颜色IDfoo,但不是2013

1重要提示:您还必须记住,颜色中添加的杂波会传递给链中的下一个命令。一旦 ID 被着色,您就不能(轻松地)匹配例如ID=111.


在某些情况下,人们可能想要文件中的终端颜色。尝试例如

 grep --color=always foo file > result
 cat result
Run Code Online (Sandbox Code Playgroud)

尽管生成的文件的可移植性非常有限。


着色本身也是一种延伸。


正如好的@slm所提到的,您可以添加:

export GREP_OPTIONS="--color=always"
Run Code Online (Sandbox Code Playgroud)

对您的.bashrc等,除非您出于某种原因真正了解其含义并且仍然想要这样做,否则不要这样做。grep由于上述事实,它会在很多方面破裂1

alias如果您经常使用它,请添加一个。

 alias cgrep='grep --color=always'
Run Code Online (Sandbox Code Playgroud)

GREP_OPTIONS--color 采取三个选项neverautoalways。两个第一个应该是唯一考虑的GREP_OPTIONS

您也可以GREP_COLORSman页面或gnu grep 中查看。

  • 将此添加到答案中:`export GREP_OPTIONS="--color=always"` in a .bashrc 使选项成为任何 grep 的默认值,您几乎已经掌握了它! (3认同)
  • 如何使 grep 保留管道输入的颜色而不向匹配添加颜色(即仅使用 grep 来过滤行)? (3认同)
  • export GREP_OPTIONS="--color=always" 已弃用 (2019),并且 'alias cgrep='grep --color=always''' 在 bash 函数中不可用。 (2认同)