【问题标题】:Preserve colouring after piping grep to grep在管道 grep 到 grep 后保留颜色
【发布时间】:2011-01-20 14:18:02
【问题描述】:

Preserve ls colouring after grep’ing 中有一个类似的问题,但如果您将彩色 grep 输出通过管道传输到另一个 grep 中,则不会保留颜色。

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

【问题讨论】:

标签: linux bash colors grep pipe


【解决方案1】:

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

正确的命令行应该是

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

这很冗长,或者你可以添加一行

alias cgrep="grep --color=always"

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

【讨论】:

  • 此解决方案仅在某些幸运情况下有效。请参阅下面的 andersonvom 的答案。
  • 在我的情况下(Ubuntu),我已经有了 grep 的别名。 alias grep='grep --color=auto 所以我只需要更改我的 ~/.bashrc 最初定义的位置。
  • 不适合我 - 类似于这种情况 stackoverflow.com/a/7640077/248616
  • 这个不错的创意很简单,很有效stackoverflow.com/a/36288791/248616
  • 问题是关于如何使第二个 grep 不抑制第一个的颜色。这不是一个答案。
【解决方案2】:

忠告:

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

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

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

【讨论】:

  • 如果您使用--color=auto,那么它应该会发现您在其他地方使用管道并完全抑制颜色,但这有点违背了目的。如果您仍然想要彩色结果,我想您可以使用--color 在最后一个管道再次对其进行 grep。
  • 至少在 Mac OS X 上,@andersonvom 建议的最后一个管道的着色不起作用。不知道为什么;也许它正在为排除的图案着色? --color=always 确实有效,我认为,上述警告。
  • 您的表达式中必须有两次相同的 grep 模式。我刚刚在 Mac 上测试了这个:http://i.imgur.com/BhmwAlF.png
【解决方案3】:

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

【讨论】:

  • 反转命令不会提供相同的结果吗? grep -v AVOID * | grep WORD
  • @BrydonGibson 可能,但这是一个示例,表明它适用于任意数量的管道命令
【解决方案4】:

现有答案仅解决 FIRST 命令为 grep 的情况(正如 OP 所要求的,但在其他情况下也会出现此问题)。

更一般的答案

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

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

Git:使用 -c color.status=always

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

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

其他

(这是一个社区 wiki 帖子,请随时添加您的)

【讨论】:

  • 一些 Git 命令也有自己的--color=always 选项,如:git branch --color=always | grep --color=never -v foo
猜你喜欢
  • 2023-01-11
  • 1970-01-01
  • 2019-01-24
  • 2010-10-12
  • 1970-01-01
  • 1970-01-01
  • 2016-08-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多