代码之家  ›  专栏  ›  技术社区  ›  Joel

基于shell中regex的颜色突出显示输出

  •  40
  • Joel  · 技术社区  · 14 年前

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

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

    > myCommand
    DEBUG foo bar
    INFO bla bla
    ERROR yak yak
    

    我希望所有与^错误\s.*匹配的行都突出显示为红色。

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

    编辑:我可能应该提到,理想情况下,我希望通过.bashrc中的“profile”选项全局启用此功能。

    8 回复  |  直到 5 年前
        1
  •  12
  •   Community basarat    7 年前

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

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

    但是,您应该仔细考虑您是否一直都想要这个特性。如果命令有自己的颜色(例如 grep --color , ls --color )?也许最好定义一个 colorizer command 然后跑 myCommand 2>&1|c 当你想着色时 myCommand 的输出。你也可以 alias some specific always-colorize commands .

    请注意,管道的返回状态是其 最后的 命令,所以如果你运行 myCommand | c ,您将获得的状态 c 不是 我的命令 . 这里有一个bash包装器,可以避免这个问题,您可以使用它作为 w myCommand :

    w () {
      "$@" | c
      return $PIPESTATUS[0]
    }
    
        2
  •  43
  •   Community basarat    7 年前

    有一个答案在 superuser.com :

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

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

    这将 “在每一行上匹配您的图案或行尾。只突出显示图案…”

        3
  •  25
  •   om-nom-nom    11 年前

    您可以使用以下程序:

    您可以这样做,但命令将看不到tty(有些命令将拒绝运行或以不同的方式运行或执行奇怪的操作):

    exec > >(histring -fEi error)    # Bash
    
        4
  •  13
  •   Benoit    14 年前

    你可以尝试(也许需要更多的逃避):

    BLUE="$(tput setaf 4)"
    BLACK="$(tput sgr0)"
    command | sed "s/^ERROR /${BLUE}ERROR ${BLACK}/g"
    
        5
  •  2
  •   userM1433372    10 年前

    尝试

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

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

        6
  •  2
  •   Bush    9 年前

    您可以在github上使用hl命令:
    Git克隆 http://github.com/mbornet-hl/hl

    然后:
    mycommand hl-r'^错误。*'

    可以使用$home/.hl.cfg配置文件简化命令行。
    hl是用c写的(源代码可用)。 您可以使用多达42种不同颜色的文本。

        7
  •  1
  •   dietbuddha    14 年前

    您可以使用别名和用户定义的shell函数为特定的命令启用它,从而避免了太多的麻烦。如果您的着色错误,我假设您要处理stderr。由于stderr在unbuffered中,您可能希望通过FIFO发送行缓冲区。

        8
  •  0
  •   skensell    9 年前

    用锥子。

     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用于图案中,因此我们不打印换行符,只需设置颜色。