在Preserve ls colouring after grep’ing中有一个类似的问题,但是如果你把彩色的grep输出管道输入到另一个grep中,颜色不会被保留,那就很烦人了。
作为示例,grep --color WORD * | grep -v AVOID
不保留第一个输出的颜色。但对我来说ls | grep FILE
要保持颜色,为什么会有差异?
答案 0 :(得分:144)
grep
有时会禁用颜色输出,例如在写入管道时。您可以使用grep --color=always
正确的命令行是
grep --color=always WORD * | grep -v AVOID
这非常冗长,或者你可以添加一行
alias cgrep="grep --color=always"
以您的.bashrc
为例,并使用cgrep
作为彩色grep。重新定义grep
时,您可能会遇到依赖于grep
的特定输出但不喜欢ascii转义码的脚本。
答案 1 :(得分:70)
一条忠告:
使用grep --color=always
时,将传递传递给下一个管道的实际字符串。这可能导致以下情况:
$ grep --color=always -e '1' * | grep -ve '12'
11
12
13
即使选项-ve '12'
应该排除中间行,也不会因为1
和2
之间存在颜色字符。
答案 2 :(得分:7)
只需在管道末端重复相同的grep命令
grep WORD * | grep -v AVOID | grep -v AVOID2 | grep WORD
答案 3 :(得分:4)
现有答案仅解决FIRST命令为grep
的情况(如OP所要求的,但在其他情况下也会出现此问题)。
基本问题是,在| grep
之前,命令意识到实现输出到管道时会通过禁用颜色来使其变得“智能”。通常这就是您想要的,这样ANSI转义码不会干扰您的下游程序。
但是,如果您希望从较早的命令中发出彩色输出,则无论输出接收器如何,都必须强制生成颜色代码。强制机制是特定于程序的。
git -c color.status=always status | grep -v .DS_Store
注意:-c
选项必须在子命令status
之前。
(这是社区Wiki帖子,请随时添加您的博客)