将grep传递到grep后保留着色


140

grep's 之后Preserve ls着色中存在一个类似的问题,但令我烦恼的是,如果将有色grep输出通过管道传输到另一个grep中,则不会保留着色。

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


2
这个问题似乎离题,因为它与Unix命令的使用有关,属于unix.stackexchange.com
Raptor

Answers:


162

grep有时会禁用颜色输出,例如在写入管道时。您可以使用grep --color=always

正确的命令行是

grep --color=always WORD * | grep -v AVOID

这很冗长,或者您也可以添加行

alias cgrep="grep --color=always"

以您.bashrc为例,并cgrep用作彩色grep。重新定义时,grep您可能会遇到依赖于grepascii转义代码的特定输出的脚本的麻烦。


4
此解决方案仅在某些幸运的情况下有效。请参阅下面的andersonvom答案。
studog '18

就我而言(Ubuntu),我已经别名为grepalias grep='grep --color=auto所以我只需要更改我~/.bashrc最初定义的位置。
sobi3ch

不适合我-与这种情况类似stackoverflow.com/a/7640077/248616
Nam G VU

这个很好的创意只是简单而有效的stackoverflow.com/a/36288791/248616
Nam G VU

问题是如何使第二个grep不压制第一个grep的颜色。这不是答案。
johannes_lalala

74

忠告:

使用时grep --color=always,将更改传递到下一个管道的实际字符串。这可能导致以下情况:

$ grep --color=always -e '1' * | grep -ve '12'
11
12
13

即使该选项-ve '12'应排除中间行,也不会因为1和之间存在颜色字符2


如果使用--color=auto,则它应该可以看出您正在将其管道输送到其他位置并完全抑制颜色,但这有点违背了目的。如果您仍然想要彩色的结果,我想您可以使用再次在最后一个管道中对它进行grep处理--color
andersonvom

2
至少在Mac OS X上,按@andersonvom的建议在最后一个管道上着色不起作用。不知道为什么;也许它正在为排除的图案着色?--color=always我认为,确实可以进行上述说明。
user766353

3
您的表达式中必须有两次相同的grep模式。我刚刚在Mac上对此进行了测试:http
andersonvom

9

只需在管道末端重复相同的grep命令即可。
grep WORD * | grep -v AVOID | grep -v AVOID2 | grep WORD


2
反转命令不会提供相同的结果?grep -v AVOID * | grep WORD
布赖登·吉布森

@BrydonGibson可能是,但是这是一个示例,表明它适用于任意数量的管道命令
Alex
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.