使用grep --color=always
时,我可以为正则表达式匹配获得漂亮的颜色突出显示。
但是,grep
仅返回至少有一个匹配的行。相反,我正在寻找一种方法来简单地突出显示正则表达式匹配,同时保留所有其他输入,而不丢弃没有任何匹配的行。
我尝试使用sed
处理颜色,并阅读grep
文档,但我似乎无法得到我想要的内容。
如果我的描述不明显,我想:
INPUT:
正则表达式:
输出:
所以我可以这样做:
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"
}
仍在寻找一种更简单的方法!
答案 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/
(女王的英语太多了。)