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

时间:2010-11-24 13:42:50

标签: linux bash shell

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

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

> myCommand
DEBUG foo bar
INFO bla bla
ERROR yak yak

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

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

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

8 个答案:

答案 0 :(得分:43)

superuser.com中有一个答案:

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

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

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

答案 1 :(得分:25)

您可以使用以下程序:

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

exec > >(histring -fEi error)    # Bash

答案 2 :(得分:13)

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

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

答案 3 :(得分:12)

如果你想全局启用它,你需要一个终端功能,而不是管道输出的进程,因为管道会破坏某些命令(两个问题是stdout和stderr会出现在-order和buffered,以及某些命令在输出到终端时表现不同。)

我不知道任何具有此功能的“常规”终端。它可以在Emacs中轻松完成,位于term缓冲区中:为font-lock-keywords配置term-mode

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

请注意,管道的返回状态是 last 命令,因此如果您运行myCommand | c,您将获得c的状态,而不是{{1 }}。这是一个避免此问题的bash包装器,您可以将其用作myCommand

w myCommand

答案 4 :(得分:2)

尝试

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

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

答案 5 :(得分:2)

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

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

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

答案 6 :(得分:1)

您可以使用别名和用户定义的shell函数为特定命令启用它,而不会遇到太多麻烦。如果你的着色错误我认为你想要处理stderr。由于stderr在无缓冲中你可能想要通过发送一个fifo来对它进行行缓冲。

答案 7 :(得分:0)

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