【问题标题】:Can you colorize specific lines that are grepped from a file?您可以为从文件中提取的特定行着色吗?
【发布时间】:2018-05-11 04:56:32
【问题描述】:

我每周运行一次 CRONTAB,它从 40 多个远程服务器收集硬件信息,并在我们总部的报告服务器上创建每周日志文件。我有一个脚本,我针对这个每周文件运行,只将特定的状态行输出到我的显示器。

#!/bin/sh

# store newest filename to variable
DD_FILE="$(ls -t /home/user/ddinfo/|head -1)"

# List the site name, disk ID (virtual & physical), Status and State of each ID, Failure Prediction for each physical disk, and the site divider
grep -w 'Site\|^ID\|^State\|^Status\|^Failure Predicted\|^##' /home/user/ddinfo/$DD_FILE
echo "/home/user/ddinfo/"$DD_FILE
exit 0

这是一个示例输出:

Accessing Site: site01
ID                            : 0
Status                        : Ok
State                         : Ready
ID                              : 0:0:0
Status                          : Ok
State                           : Online
Failure Predicted               : No
ID                              : 0:0:1
Status                          : Ok
State                           : Online
Failure Predicted               : No
################################################
Accessing Site: site02
ID                            : 0
Status                        : Ok
State                         : Ready
ID                              : 0:0:0
Status                          : Non-Critical
State                           : Online
Failure Predicted               : Yes
ID                              : 0:0:1
Status                          : Ok
State                           : Online
Failure Predicted               : No
################################################

有没有办法 cat / grep / sed / awk / perl / 这个输出,以便任何以 CriticalYes 结尾的行都被着色?

【问题讨论】:

  • 在什么情况下着色? Shell 输出到虚拟终端?这完全取决于所使用的 shell 和终端仿真器、仿真器对颜色的支持以及在输出文本流中嵌入颜色属性的机制。许多终端仿真器支持 ANSI 转义序列,因此在处理需要着色的行时,您需要自己插入这些转义序列。
  • 你检查过perl的模块Term::ANSIColor吗?
  • 无颜色:less -p '.*Critical$|.*Yes$|$' file?

标签: bash perl awk sed


【解决方案1】:

感谢您的所有回复。我最终将原始 grep 结果传送到另一个 grep | grep --color=auto '.*\(Yes\|Critical\).*\|$' 并得到了我想要的彩色结果:

grep -i 'site\|^ID\|^State\|^Status\|^Failure Predicted\|^##' /home/user/ddinfo/$DD_FILE | grep --color=auto '.*\(Yes\|Critical\).*\|$'

这是新的示例输出:

【讨论】:

    【解决方案2】:

    使用 GNU grep:

    grep --color -E ".*Yes$|.*Critical$|$" file
    

    【讨论】:

    • 天哪,你是对的。结尾|$ 有所不同——所有行都被保留,但只有匹配模式的行被着色。但老实说,我一头雾水,想明白为什么这个解决方案有效……太棒了。 +1
    • @GeorgeVasiliou:此表达式显示每行末尾包含YesCritical,并显示包含换行符的每一行。
    • 奇怪的是每行包含一个新行 ($) 都没有着色。我期待您以|$ 结尾的命令为所有行着色。不管怎样,我们今天学到了一些新东西。
    • @GeorgeVasiliou:导致换行符的零字节是不可见的:D
    • 减少重复结构的调整:grep --color -E '(.*(Yes|Critical))?$' file
    【解决方案3】:

    要查看所有行,但以CriticalYes 结尾的行已着色,请尝试:

    awk -v on="$(tput smso)" -v off="$(tput rmso)" '/(Critical|Yes)$/{$0=on $0 off} 1' logfile
    

    这使用tput 创建适合您终端的代码。出于演示目的,我选择了smso/rmso 来设置和重置“杰出模式”。您可以使用tput 支持的任何其他功能。

    变化

    如果我们想要红色的文本而不是“突出模式”:

    awk -v on="$(tput setaf 1)" -v off="$(tput sgr0)" '/(Critical|Yes)$/{$0=on $0 off} 1' logfile
    

    tput setaf 1 是创建红色的代码。 (In tput, red is 1, green is 2, etc.)tput sgr0是关闭所有属性的代码。

    工作原理

    • -v on="$(tput smso)" -v off="$(tput rmso)"

      这定义了两个 awk 变量,onoff,它们可以打开和关闭我们喜欢的任何颜色效果。

    • /(Critical|Yes)$/{$0=on $0 off}

      对于以CriticalYes 结尾的任何行,我们将on 代码添加到行的前面,并将off 代码添加到末尾。

    • 1

      这是 awk 对 print-the-line 的神秘简写。

    【讨论】:

      【解决方案4】:

      你可以试试,一个非常好的grep替代品:

      % ack '(Critical|Yes)$' file
      # Or to colorize the whole line:
      % ack '(.*(Critical|Yes))$' file
      

      Beyond grep

      或者,如果您想查看所有线条并且只为特定线条着色:

      use Term::ANSIColor qw/ colored /;
      while (<$fh>) {
          s/(.*)(Critical|Yes)$/colored(["yellow bold"], $1.$2)/e;
          print;
      }
      

      【讨论】:

      • ack 命令还有一个--passthru 选项可以打印所有行,无论它们是否匹配。突出显示当然只适用于匹配的行。
      【解决方案5】:

      你可以使用 Perl 的Term::ANSIColor 模块:

      ... | perl -pne 'BEGIN { use Term::ANSIColor } /: (Yes|Critical)$/ && { $_ = color("red") . "$_" . color("reset") }'
      

      【讨论】:

      • 这个解决方案对我不起作用。 Perl 给出了输出但没有任何颜色。我在运行 10.12.6 和 Perl 5.18 的 Mac 上。
      猜你喜欢
      • 1970-01-01
      • 2017-06-03
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      • 2011-07-17
      • 2020-10-11
      • 2022-01-12
      • 1970-01-01
      相关资源
      最近更新 更多