用不同的颜色标记出现的关键字


13

我有一个程序,它吐出一个输出stdout像:

[OK]      Something is ok
[OK]      Something else is also ok
[FAIL]    This does not look good
[FAIL]    Neither does this
[OK]      At least this is fine

为了更容易发现输出失败,我想FAIL用红色标记关键字的出现而不会丢弃其他消息。如果我还可以OK用绿色:) 突出显示关键字,那就太好了。

进行管道连接egrep --color FAIL只会显示FAIL关键字所在的行。


1
有关grep解决方案,请参见unix.stackexchange.com/a/34322
manatwork

您有权更改源代码吗?是bash脚本吗?
h3rrmiller 2012年

@manatwork从你指定我点击我的方式来链接stackoverflow.com/questions/972370,并与一些tail -fawk神奇,我好去=)
特奥多尔·

Answers:


10

基于manatwork另一个问题中出色的小“或没有”技巧,我提供了这一点,它增加了获得两种突出颜色的能力:

 $ myprogram | \
   GREP_COLORS='mt=01;32' egrep --color=always '\[OK\]|' | \
   GREP_COLORS='mt=01;31' egrep --color=always '\[FAIL\]|'

也就是说,您grep对输出运行了两次,GREP_COLORS每次都使用不同的环境变量。

“ 01; 32”值表示“绿色粗体”,另一个表示“红色粗体”。有关更多建议,请参见Wikipedia 上有关ANSI代码的文章

las,这需要GNU grep版本2.5.3或更高版本。较旧的GNU grep版本支持不同的着色机制,但是这些版本存在一个错误,使您无法多次在管道中使用该功能。BSD grep模拟了较旧的GNU grep着色机制,它将在管道中工作两次,但是由于被manatwork黑客入侵,它大喊“空子表达式” 。

您可以在前两行的末尾删除反斜杠,以使它们全部成为一行。为了清楚起见,我将其拆分为此处,并与SE页面格式配合使用。


那真是太好了!但是由于某种原因,该脚本似乎并未突出显示我计算机上的第二条语句。我运行CentOS的5
特奥多尔

2
这里发生的是CentOS 5附带了一个足够老的GNU grep,它不支持GREP_COLORS复数形式。它GREP_COLOR仅使用较旧的方法,并且该方法中存在一个错误,导致其无法正确执行操作。如果更改了要使用的命令GREP_COLOR=32等,它将仅更改第一个匹配项的突出显示颜色。如果通过管道传递结果,则hexdump -c可以看到添加第二个egrep命令确实可以执行某些操作,但这不是合法的ANSI。底线:您必须进行升级grep才能使其正常工作。
沃伦·杨

哈哈,这真是有见地的评论。是的,CentOS5已经过时了,因为在旧计算机上运行的许多OS:会吐出旧的,被遗忘的日志消息:)我将尝试查看是否无法升级到centos6。
Theodor

我刚刚在CentOS 6盒子上检查了我的解决方案,它那儿确实起作用,确认了我的诊断。(早期的测试是在Ubuntu服务器上进行的。)EL6随GNU grep 2.6.3一起提供。有趣的是,GREP_COLOR即使该功能在被替换后就已被弃用,他们也确实修复了(单个)错误。
沃伦·杨

我不明白这是如何解决问题的,因为第一个grep会过滤掉所有的“失败”,因此第二个grep将没有匹配的
东西了。– laertis

1

您可以为此使用multitail或ccze,都允许配置描述正则表达式进行匹配和着色。


1

基于沃伦·杨(Warren Young)的回答,我编写了此Python脚本该脚本更优雅地完成了同一件事,并且键入的次数更少。因此,这就是您使用该脚本的方式:

cat yourfile | himul '\[OK\]' '\[FAIL\]'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.