【问题标题】:Highlight grep results in different colors, depending on output根据输出高亮 grep 结果以不同的颜色
【发布时间】:2018-12-26 03:31:20
【问题描述】:

如何根据匹配的内容以不同的颜色(例如绿色或红色)突出显示 grep 结果?

目前,我已经这样做了:

grep -H -i "^mail.hostname" WEB-INF/config/mail.props | grep --color=auto -P "\=.*"

哪个输出(例如):

WEB-INF/config/mail.props:mail.hostname=localhost

=localhost 突出显示的位置。 (注意——我希望不要突出显示 = 符号,但这是另一回事。)

如何使突出显示在 localhost 时显示为绿色,而对于任何其他值(例如 smtpserver)显示为红色?

更新 -- 回答前 2 个 cmets:

如果我这样做:

grep -H -i "^mail.hostname" WEB-INF/config/mail.props \
    | GREP_COLOR='01;31' grep --color=auto -P '=\K.*' \
    | GREP_COLOR='01;32' grep --color=auto -P '=\Klocalhost'

只有在匹配localhost时才会打印该行(以绿色突出显示)...不是预期的结果...

【问题讨论】:

  • 为了避免=被高亮,可以使用grep --color=auto -P '=\K.*'(注意:=不需要转义)
  • 感谢 cmets...我快到了,但还没到...
  • 尝试使用 grep --color=always 作为中间 grep
  • grep -H -i "^mail.hostname" WEB-INF/config/mail.props | GREP_COLOR='01;31' grep --color=always -P '=\K.*' | GREP_COLOR='01;32' grep --color=auto -P '=\Klocalhost' 不再有输出

标签: bash shell colors grep match


【解决方案1】:

这里的中间 grep 它将找到所有“=xxxx”并将 xxxx 部分涂成红色。

最后一个 grep 查找“localhost”或行首,并将它们标记为绿色。因为“行首”不是可显示的字符,它没有着色,但因为所有行都有“行首”,所以中间 grep 中的所有行都会传递到输出。

grep -H -i "^mail.hostname" WEB-INF/config/mail.props | GREP_COLOR='01;31' grep --color=always -P '=\K.*' | GREP_COLOR='01;32' grep -E --color=always 'localhost|^'

感谢 Sundeep 提供“grep -P”提示。

我喜欢 OP 的 [^=]*$ 匹配“=”符号之后的所有内容!

【讨论】:

  • 在“=”符号之后匹配什么更好?你的正则表达式是\K 还是我的[^=]
  • 有点判断调用 - -P 使用 Perl 正则表达式,我们中的一些人不习惯,而你的则不太明显(这是我要添加的那种东西在 shell 脚本中注释)。哪个都好!
  • 对我来说,Perl 正则表达式真的是个谜……所以,我更喜欢另一个……习惯问题……谢谢你的解释。
  • 如果两个 '='s 在一行中,[^=]*$ 的工作方式也会不同!
  • 更简单(也更常见)的示例... df | grep --color=always -P '% \K.*'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-29
  • 2011-02-14
  • 2015-06-28
  • 2022-12-04
  • 1970-01-01
相关资源
最近更新 更多