使用--color = always选项时,grep结果会产生不同的结果

时间:2014-06-07 03:29:54

标签: linux bash grep

我用grep遇到了这个问题,想知道它是不是一个bug。可重现的场景是一个包含以下内容的文件:

string
string-

并将其另存为'file'。目标是使用grep with --color = always输出'string',同时排除'string-'。如果没有--color,以下工作正常:

$ grep string file | grep -v string-

但是使用--color输出两个实例:

$ grep --color=always string file | grep -v string-

我尝试了几种变体但似乎--color打破了预期的行为。这是一个错误还是我误解了什么?我的假设是,通过--color应该对结果没有影响。

2 个答案:

答案 0 :(得分:2)

当你使用--color grep时添加ANSI(我相信?)颜色编码。所以你的文字看起来像这样:

string
string-

在纯净的,未经处理的ASCII文本方面看起来实际上是这样的:

^[[01;31m^[[Kstring^[[m^[[K
^[[01;31m^[[Kstring^[[m^[[K-

this question thread提供了一些很好的信息,包括这个很棒的this answer

  

我的假设是通过--color应该对结果没有影响。

不。 grep的目的 - 与大多数Unix / Linux工具一样 - 是提供基本的简单服务&做得好并且该服务是基于模式和&amp ;;搜索纯文本(此处为键)输入文件。返回输出。 --color选项只是对我们是人类&整天盯着带有无色文字的屏幕可以让你疯狂。颜色编码使工作更轻松。

因此,ANSI的颜色编码通常被认为是一个过程的最后一步。 grep假设如果它在输入中遇到ANSI则不应该忽略它。也许可以在--decolor添加grep选项,但我怀疑这是值得付出的功能。

grep是基本级纯文本解析工具。没有更多&没什么。

答案 1 :(得分:1)

@Jake Gould's answer对实际发生的情况进行了很好的分析,但让我尝试用不同的方式来表达它:

--color=always使用ANSI escape codes进行着色。

换句话说: --color=always按设计ALTERS输出,因为它必须添加必要的转义序列才能实现着色。

永远不要使用--color=always,除非您知道输出预期包含ANSI转义序列 - 通常,对于终端上的人眼球。

如果您不确定输入的处理方式,请使用--color=auto ,我相信这会导致grep仅应用着色 其标准输出连接到终端

我是一个给定的管道,通常只对将--color=auto(或--color=always)应用于grep命令是有意义的,该命令是最后一个命令管道