【问题标题】:Different results in grep results when using --color=always option使用 --color=always 选项时 grep 结果的不同结果
【发布时间】:2014-06-07 12:18:28
【问题描述】:

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

string
string-

并将其保存为“文件”。目标是使用带有 --color=always 的 grep 来输出 'string' 而排除 'string-'。如果没有 --color,以下将按预期工作:

$ grep string file | grep -v string-

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

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

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

【问题讨论】:

  • 试试grep --color=always string file > f。现在在可以查看控制字符的编辑器中打开 f - 应该有一些 color escape sequences 插入到各种可能意外的位置。
  • 或可能预期的位置,例如'string'之前和之后:)
  • 问题是 grep 是否应该优雅地处理这种情况。具体来说,除了突出显示匹配的文本之外, --color 是否旨在具有与没有它时相同的行为。
  • @soreau “具体来说,无论 --color 是否旨在具有与没有它时相同的行为,除了突出显示匹配的文本。” --color 的目的是使非可视界面更具可视化和可读性。这意味着它可以被视为 shell 命令链中的最后一步。认为这是对人类需要阅读此文本的最简单的认可,我们必须将其混合起来,以免眼睛感到无聊。
  • 您可以反转这些操作:grep -v string- file | grep --color=always string

标签: linux bash grep


【解决方案1】:

当您使用--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 工具一样——的目的是提供一个基本的简单服务并把它做好。该服务是基于模式搜索纯文本(此处为关键字)输入文件并返回输出。 --color 选项是对我们是人类这一事实的一个小小的认可,整天盯着屏幕上没有颜色的文字会让你发疯。颜色编码使工作更轻松。

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

grep 是一个基本的纯文本解析工具。不多也不少。

【讨论】:

  • 因此没有理由提交错误报告。谢谢。
  • @soreau 非常有信心这不是错误。在我的答案中添加了更多详细信息。
【解决方案2】:

@Jake Gould's answer 对实际发生的情况进行了很好的分析,但让我尝试换一种说法:

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

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

切勿使用--color=always,除非您知道输出预计包含 ANSI 转义序列 - 通常用于终端上的人眼。

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

对于给定的管道,通常只有将--color=auto(或--color=always)应用于作为管道中最后一条命令的grep 命令才有意义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-01
    • 2020-05-19
    相关资源
    最近更新 更多