我想知道我是否可以突出显示匹配某些字符串的shell命令的输出。
例如,如果我运行myCommand,输出如下:
> myCommand
DEBUG foo bar
INFO bla bla
ERROR yak yak
我希望所有符合^ ERROR \ s。*的行都突出显示为红色。
同样,我希望将相同的突出显示应用于grep的输出,减去等...
编辑:我可能应该提一下,理想情况下,我想通过我的.bashrc中的'profile'选项全局启用此功能。
答案 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 --color
,ls --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用于图案中,因此我们不打印换行符,只需设置颜色。