使用时,grep --color=always
我可以为正则表达式匹配获得漂亮的颜色突出显示.
但是,grep
只返回至少有一个匹配的行.相反,我正在寻找一种方法来简单地突出正则表达式匹配,同时保留所有其他输入,而不丢弃没有任何匹配的行.
我试图使用颜色sed
,并阅读grep
文档,但我似乎无法得到我想要的.
如果我的描述不明显,我想要:
INPUT:
弗雷德
摊晒
红色
铅
正则表达式:
".*红色"
OUTPUT:
弗雷德(红色)
摊晒
红色(红色)
铅
所以我可以这样做:
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" }
仍在寻找一种更简单的方法来做到这一点!
最简单的解决方案是使用egrep --color=always 'text|^'
哪个匹配所有行开头但只为所需文本着色.
这是我用来着色输出的脚本.
我想我在某种博客或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 ...
例如
dmesg | colorize.sh red '.*Hardware Error.*' red 'CPU[0-9]*: Core temperature above threshold' \ green 'wlan.: authenticated.*' yellow 'wlan.: deauthenticated.*'
不适用于重叠模式,但我发现它非常有用.
HTH