管道grep到grep后保留着色

时间:2010-02-24 15:36:33

标签: linux bash colors grep pipe

Preserve ls colouring after grep’ing中有一个类似的问题,但是如果你把彩色的grep输出管道输入到另一个grep中,颜色不会被保留,那就很烦人了。

作为示例,grep --color WORD * | grep -v AVOID不保留第一个输出的颜色。但对我来说ls | grep FILE要保持颜色,为什么会有差异?

4 个答案:

答案 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'应该排除中间行,也不会因为12之间存在颜色字符。

答案 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

git -c color.status=always status | grep -v .DS_Store

注意:-c选项必须在子命令status之前。

其他

(这是社区Wiki帖子,请随时添加您的博客)