基于shell中的正则表达式突出显示输出的颜色

Joe*_*oel 43 linux bash shell

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

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

> myCommand
DEBUG foo bar
INFO bla bla
ERROR yak yak
Run Code Online (Sandbox Code Playgroud)

我希望所有符合^ ERROR\s.*的行都突出显示为红色.

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

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

E.Z*_*.Z. 46

superuser.com上有一个答案:

your-command | grep -E --color 'pattern|$'
Run Code Online (Sandbox Code Playgroud)

要么

your-command | grep --color 'pattern\|$'
Run Code Online (Sandbox Code Playgroud)

这将"匹配您的模式或每行的行尾.只突出显示模式......"

  • 这是此函数的一个版本,您可以将其添加到.bashrc / .bash_profile中(用换行符替换-):#突出显示通过管道传递给该函数的文本中某个字符串的所有出现。---#用法示例:echo'hello world'| hilight world ---功能突出显示{grep -E --color“ $ 1 | \ $”; } (2认同)

Pau*_*ce. 25

您可以使用以下程序:

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

exec > >(histring -fEi error)    # Bash
Run Code Online (Sandbox Code Playgroud)


Ben*_*oit 13

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

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


Gil*_*il' 12

如果你想在全球范围内实现这一点,你会想要一个终端功能,而不是一个过程,你管的输出入,因为管道将是破坏性的一些命令(两个问题是输出和错误会出现乱序和缓冲,而某些命令只是表现不同输出到终端时).

我不知道这个功能的任何"传统"终端.它很容易在Emacs做,在一个term缓冲区:配置font-lock-keywordsterm-mode.

但是,您应该仔细考虑是否真的想要该功能.如果命令有它自己的颜色(例如grep --color,ls --color)?也许最好为colorizer命令定义一个短别名,并myCommand 2>&1|c在你想要着色myCommand的输出时运行.您还可以为一些特定的always-colorize命令添加别名.

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

w () {
  "$@" | c
  return $PIPESTATUS[0]
}
Run Code Online (Sandbox Code Playgroud)