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


15

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

echo "foo bar" | grep foo | grep bar

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


另一个答案相同的问题:如何在bash函数中将彩色输出恢复到grep?
卡米尔·古德塞内

Answers:


23

使用--color=always

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

foo ^[[01;31m^[[Kbar^[[m^[[K

来自例如:

grep pattern file > result

覆盖使用--color=always

grep --color=always pattern file | ...

例:

拥有档案:

ID=111;Year=2013;foo=bar
ID=222;Year=2013;foo=baz

然后

grep --color=always ID file | grep --color=always 2013 | grep foo

将颜色ID2013foo

grep --color=always ID file | grep 2013 | grep foo

将颜色IDfoo,但不会2013

1重要:您还必须记住,从颜色中添加的杂波将传递到链中的下一个命令。ID上色后,您就无法(轻松地)匹配ID=111


在某些情况下,可能需要在文件中添加终端颜色。尝试例如

 grep --color=always foo file > result
 cat result

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


着色本身也是一种扩展。


如好@slm所述,您可以添加:

export GREP_OPTIONS="--color=always"

.bashrc等等,但不,除非你出于某种原因真正理解的含义,还是要去做。grep由于上述事实1,它在许多方面都将破裂。

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

 alias cgrep='grep --color=always'

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

您也可以GREP_COLORSman页面或gnu grep中签出。


:这个方法优点/缺点这里的其他细节stackoverflow.com/questions/867877/...
SLM

1
也将其添加到答案中:export GREP_OPTIONS="--color=always"在.bashrc中,将选项设置为任何粗俗的默认设置,您几乎已经钉上了它!
slm

:在这个超级Uuser Q&A的好东西superuser.com/questions/36022/...
SLM

“ grep检测是否输出到管道” –啊!这是关键,如果grep是管道的一部分,则它不会着色。应该针对这种情况制定替代原则:-/
Chris2048

@ Chris2048:这是大多数工具将颜色打印到终端的标准配置。您可能会由此发现更多有关如何检测它的细节,并且这在OSX本机ls和gnu coreutils 上通过ls和color显示了一些问题。
13年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.