【问题标题】:Colour highlighting output based on regex in shell基于shell中正则表达式的颜色突出显示输出
【发布时间】:2011-05-15 02:55:48
【问题描述】:

我想知道是否可以用颜色突出显示匹配某些字符串的 shell 命令的输出。

例如,如果我运行 myCommand,输出如下:

> myCommand
DEBUG foo bar
INFO bla bla
ERROR yak yak

我希望匹配 ^ERROR\s.* 的所有行都以红色突出显示。

同样,我希望将相同的突出显示应用于 grep、less 等的输出...

编辑:我可能应该提一下,理想情况下,我想通过我的 .bashrc 中的“配置文件”选项全局启用此功能。

【问题讨论】:

    标签: linux bash shell


    【解决方案1】:

    superuser.com有答案:

    your-command | grep -E --color 'pattern|$'
    

    your-command | grep --color 'pattern\|$'
    

    这将“匹配您的模式或每行的行尾。仅突出显示模式...”

    【讨论】:

    • 查看grep 手册页,尤其是GREP_COLORS 环境变量的文档。
    • 这是一个可以添加到 .bashrc/.bash_profile 的函数的版本(用换行符代替 --- . ---# 示例用法:echo 'hello world' | hilight world ---function highlight { grep -E --color "$1|\$"; }
    【解决方案2】:

    您可以使用以下程序:

    你可以做这样的事情,但命令不会看到 tty(有些会拒绝运行或表现不同或做奇怪的事情):

    exec > >(histring -fEi error)    # Bash
    

    【讨论】:

      【解决方案3】:

      如果您想全局启用此功能,您将需要一个终端功能,而不是您通过管道输出的进程,因为管道会破坏某些命令(两个问题是 stdout 和 stderr 会出现-order 和缓冲,并且某些命令在输出到终端时的行为不同)。

      我不知道任何具有此功能的“传统”终端。这很容易在 Emacs 中完成,在 term 缓冲区中:为 term-mode 配置 font-lock-keywords

      但是,您应该仔细考虑您是否真的一直想要该功能。如果命令有自己的颜色(例如grep --colorls --color)怎么办?当您想为myCommand 的输出着色时,最好为colorizer command 定义一个短别名并运行myCommand 2>&1|c。你也可以alias some specific always-colorize commands

      注意,管道的返回状态是它的最后命令,所以如果你运行myCommand | c,你会得到c的状态,而不是myCommand。这是一个避免此问题的 bash 包装器,您可以将其用作 w myCommand

      w () {
        "$@" | c
        return $PIPESTATUS[0]
      }
      

      【讨论】:

      • 请注意,w 是 Linux 中类似于 who 的实用程序。
      【解决方案4】:

      您可以尝试(可能需要更多转义):

      BLUE="$(tput setaf 4)"
      BLACK="$(tput sgr0)"
      command | sed "s/^ERROR /${BLUE}ERROR ${BLACK}/g"
      

      【讨论】:

      • 要突出显示来自 make 的 gcc 错误和警告,请将以下内容另存为 ~/bin/errmake:make $@ 2>&1 | sed -e "s/error:/$(tput setab 1 ; tput bold)error:$(tput sgr0)/g" -e "s/warning:/$(tput setab 4 ; tput bold)warning:$(tput sgr0)/g"
      【解决方案5】:

      你可以在 github 上使用 hl 命令:
      git clone http://github.com/mbornet-hl/hl

      然后:
      我的命令 | hl -r '^ERROR.*'

      您可以使用 $HOME/.hl.cfg 配置文件来简化命令行。
      hl 是用 C 语言编写的(源代码可用)。 您最多可以使用 42 种不同颜色的文本。

      【讨论】:

        【解决方案6】:

        试试

        tail -f yourfile.log | egrep --color 'DEBUG|'
        

        其中 DEBUG 是您要突出显示的文本。

        【讨论】:

          【解决方案7】:

          使用 awk。

           COLORIZE_AWK_COMMAND='{ print $0 }'
           if [ -n "$COLORIZE" ]; then
               COLORIZE_AWK_COMMAND='
               /pattern1/ { printf "\033[1;30m" }
               /pattern2/ { printf "\033[1;31m" }
               // { print $0 "\033[0m"; }'
           fi
          

          然后你可以通过管道输出你的输出

          ... | awk "$COLORIZE_AWK_COMMAND"
          

          printf 用于模式,所以我们不打印换行符,只需设置颜色。

          【讨论】:

            【解决方案8】:

            您可以使用别名和用户定义的 shell 函数为特定命令启用它,而不会有太多麻烦。如果您的着色错误,我假设您要处理 stderr。由于 stderr 处于无缓冲状态,您可能希望通过 fifo 发送来对其进行行缓冲。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2017-05-11
              • 2021-08-14
              • 2019-10-31
              • 2012-03-26
              • 1970-01-01
              • 2017-01-19
              • 2012-01-13
              相关资源
              最近更新 更多