颜色正则表达式匹配 - 没有丢失未命中

时间:2008-10-27 20:46:46

标签: regex linux

使用grep --color=always时,我可以为正则表达式匹配获得漂亮的颜色突出显示。

但是,grep仅返回至少有一个匹配的行。相反,我正在寻找一种方法来简单地突出显示正则表达式匹配,同时保留所有其他输入,而不丢弃没有任何匹配的行。

我尝试使用sed处理颜色,并阅读grep文档,但我似乎无法得到我想要的内容。

如果我的描述不明显,我想:

INPUT:

  • fred的
  • 泰德
  • 红色

正则表达式:

  • “*红色”

输出:

  • fred(红色)
  • 泰德
  • 红色(红色)

所以我可以这样做:

list_stuff | color_grep "make_this_stand_out_but_dont_hide_the_rest"

编辑:

我找到了一个不太漂亮的解决方案,但它确实有效:

感谢: http://www.pixelbeat.org/docs/terminal_colours/

特别是脚本(我修改/简化): http://www.pixelbeat.org/talks/iitui/sedgrep

function sedgrep ()
{
    C_PATT=`echo -e '\033[33;01m'`
    C_NORM=`echo -e '\033[m'`

    sed -s "s/$1/${C_PATT}&${C_NORM}/gi"
}

仍在寻找一种更简单的方法!

7 个答案:

答案 0 :(得分:20)

最简单的解决方案是使用egrep --color=always 'text|^'来匹配所有行开头但只为所需文本着色。

答案 1 :(得分:7)

这是我用来着色输出的脚本。

我想我在某种博客或bash / sed教程中找到了这个想法/片段 - 已经很久以前找不到它了。

#!/bin/bash

red=$(tput bold;tput setaf 1)            
green=$(tput setaf 2)                    
yellow=$(tput bold;tput setaf 3)         
fawn=$(tput setaf 3)
blue=$(tput bold;tput setaf 4)           
purple=$(tput setaf 5)
pink=$(tput bold;tput setaf 5)           
cyan=$(tput bold;tput setaf 6)           
gray=$(tput setaf 7)                     
white=$(tput bold;tput setaf 7)          
normal=$(tput sgr0)                      

sep=`echo -e '\001'` # use \001 as a separator instead of '/'

while [ -n "$1" ] ; do
  color=${!1}
  pattern="$2"
  shift 2

  rules="$rules;s$sep\($pattern\)$sep$color\1$normal${sep}g"
done

#stdbuf -o0 -i0 sed -u -e "$rules"
sed -u -e "$rules"

用法:

./colorize.sh color1 pattern1 color2 pattern2 ...

e.g。

dmesg | colorize.sh red '.*Hardware Error.*' red 'CPU[0-9]*: Core temperature above threshold' \
green 'wlan.: authenticated.*' yellow 'wlan.: deauthenticated.*'

重叠模式效果不佳,但我发现它非常有用。

HTH

答案 2 :(得分:3)

这个小功能在我的ZShell中运行良好:

function color_grep {
    sed s/$1/$fg[yellow]$1$terminfo[sgr0]/g
}

(需要

autoload colors zsh/terminfo

也许你可以做类似的事情?

编辑:对不起,这不适用于正则表达式。你将不得不稍微调整一下......

答案 3 :(得分:1)

你现在这样做的方式可能就像你期望的那样干净,除非你自己编写自己的grep工具。如果你不一定关心保留输出的顺序,这是我能想到的另一种方法:

function colormatch ()
{
    tee - | grep --color=always $1 | sort | uniq
}

效率不如使用sed(创建更多进程,以及输出),所以我建议坚持使用你的sed解决方案。

答案 4 :(得分:1)

你可以使用-C<num>选项grep,它会在你的匹配项周围显示<num>个上下文行。只需确保<num>至少与文件中的行数一样大。

答案 5 :(得分:0)

我最近做了类似过滤器的事情。我用它来为带有多个文件的尾部的“标题”着色,如下所示:

tail -f access.log error.log foo.log | logcol.sh

标题如下所示:

==&GT; access.log&lt; ==

我对不同日志文件之间的快速更改感到困惑,所以这个logcol.sh会有所帮助。 ==&gt;是特定用途的硬编码,但也可以是参数。

#!/bin/sh
while read line
do
  if test `expr "$line" : "==>.*"`  -eq 0 ;
  then
    printf '\033[0m%s\n' "$line"
  else
    printf '\033[0;31m%s\n' "$line"
  fi
done

也许不是最优雅但我觉得它很可读。 我希望我没有任何错别字;-) HTH, 抢劫

答案 6 :(得分:0)

我正在挖掘这个小python实用程序。如果不是debian,请使用alien转换为rpm。

http://korpus.juls.savba.sk/~garabik/software/grc.html

regexp=.*red
colours="\033[38;5;160m"
count=once

这是关于终端颜色的一个很好的页面。

http://www.pixelbeat.org/docs/terminal_colours/

(女王的英语太多了。)