管道grep到grep后保留着色

Zit*_*rax 133 linux bash grep pipe colors

在grep'ing之后Preserve ls着色中有一个类似的问题,但是如果你把彩色的grep输出管道输入另一个grep,颜色不会被保留,那就烦人了.

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

Ott*_*ger 154

grep有时会禁用颜色输出,例如在写入管道时.您可以使用覆盖此行为grep --color=always

正确的命令行将是

grep --color=always WORD * | grep -v AVOID
Run Code Online (Sandbox Code Playgroud)

这非常冗长,或者您可以添加该行

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

以您.bashrc为例,并cgrep用作彩色grep.重新定义时,grep您可能会遇到依赖于特定输出grep且不喜欢ascii转义码的脚本的问题.

  • 此解决方案仅适用于某些幸运情况.请参阅下面的andersonvom的答案. (4认同)

and*_*vom 73

一句忠告:

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

$ grep --color=always -e '1' * | grep -ve '12'
11
12
13
Run Code Online (Sandbox Code Playgroud)

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

  • 您必须在表达式中两次使用相同的grep模式.我刚刚在Mac上测试了这个:[http://i.imgur.com/BhmwAlF.png ](http://i.imgur.com/BhmwAlF.png) (3认同)
  • 至少在Mac OS X上,@ andersonvom建议在最后一个管道上着色不起作用.不确定为什么; 也许是为排除模式着色?`--color = always`确实有效,我认为,上面提到的警告. (2认同)

Sri*_*bat 12

现有的答案仅针对 FIRST 命令的情况grep(如 OP 所问,但在其他情况下也会出现此问题)。

更一般的答案

基本问题是命令 BEFORE| grep试图通过在意识到输出进入管道时禁用颜色来“智能”。这通常是您想要的,以便 ANSI 转义码不会干扰您的下游程序。

但是,如果您想要从早期命令发出的彩色输出,则需要强制生成颜色代码,而不管输出接收器如何。强制机制是特定于程序的。

Git:使用 -c color.status=always

git -c color.status=always status | grep -v .DS_Store
Run Code Online (Sandbox Code Playgroud)

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

其他

(这是一个社区维基帖子,所以请随意添加您的)

  • 一些 Git 命令也有自己的 `--color=always` 选项,如: `gitbranch --color=always | grep --color=never -v foo` (2认同)

Ale*_*lex 9

虽然有点'hack-ish',但它也可以简单地重复管道末端的grep命令.
grep WORD * | grep -v AVOID | grep -v AVOID2 | grep WORD

  • 反转命令不会提供相同的结果?`grep -v AVOID * | grep WORD` (2认同)