Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2315223
  • 博文数量: 527
  • 博客积分: 10343
  • 博客等级: 上将
  • 技术积分: 5565
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-26 23:05
文章分类

全部博文(527)

文章存档

2014年(4)

2012年(13)

2011年(19)

2010年(91)

2009年(136)

2008年(142)

2007年(80)

2006年(29)

2005年(13)

我的朋友

分类: LINUX

2007-03-28 16:41:12

首先熟悉颜色代码的"通用"表示:
对于两位的数字
第一位数字为3表示定义的是前景色, 为4表示背景色
第二位数字定义具体的颜色. 1 为Red, 2为Green, 3为Blue, 0表示黑色

举例: 31;40m 表示前景为红色, 背景色为黑色.

前景背景色之间用;来分隔. 以字符m表示定义的结束, 如果没有前景或背景的定义则沿用当前的设置. 单个的数字0表示是较暗的颜色, 为1表示是较亮的颜色, 这个较亮较暗都是指前景色而言.

以上所说的"通用"是一般的字符终端的驱动所理解的颜色代码的表示法, 当然, 颜色表示必需是一个比较少会出现的特殊字符序列开始的. 这个序列是
^[[ 其中^[的ASCII的27, 也就是通过由Escape输入的值, 在终端命令行上, 需要用
ESC 来输入它.

下面是我们可以在哪些方面变得好色:
1. 命令行的提示字符串
在这里定义颜色千万要注意用 \[表示特殊序列的开始, 用\]表示特殊序列的结束, 否则终端驱动会错误地计算提示字符串应该占用多少个字符的空间, 因为象 ^[[31;40m 这么多字符其实并不占用屏幕上的输出空间, 其目的只是改变颜色而已.

2. ls --color
初步好色的人才会老老实实地输入长长的 --color, 老色鬼早就用alias把自己隐藏起来了
具体什么文件用什么颜色显示要看 LS_COLORS环境变量的内容了, 这个环境变量内容实在是长, 不过定义它不必一个一个敲进去, dircolors 命令可以从 /etc/DIR_COLORS 中读取一个可读形式的颜色定制方案, 然后转换成一个压缩版的环境变量, 注意dircolors的输出是一个命令, 这个命令本身需要你的当前shell去执行才会生效.
需要 eval "$(dircolors /etc/DIR_COLORS)" 才会在你的当前环境中加入LS_COLORS变量. 在子SHELL中执行它将不会惠及父进程.

3. grep --color
我曾经设想过为黑白时代的grep加入高亮其颜色支持的功能, 不想已经先于我被实现出来了. 这可能不是POSIX对grep规范的一部分, 但实在是好处多多, 尤其对于初涉正则表达式的人来说, 它不但让你得到匹配的行, 还以醒目的方式告诉你这一行的哪个部分匹配到了你的正则表达式, 因而会被匹配到
grep -P 'ab+' <<输出的是
abbbbbbbbbbbbb
从头到尾都是红的
输出的也是
abbbbbbbbbbbbb
只有开头的ab两个字符才是红色的.

4. 为任意的输出着色
grep只会显示那些匹配的行, 或不匹配的行, 所以它无法同时显示那些不匹配的行, 比如, 下面是cvs的输出
revision 1.1.1.1.2.3
date: 2005/09/08 08:19:52;  author: Admin;  state: Exp;  lines: +16 -0;  kopt: kv;  co
mmitid: 16c4431ff4271016;  filename: abc;
no message
----------------------------
revision 1.1.1.1.2.2
date: 2005/08/22 08:48:48;  author: Admin;  state: Exp;  lines: +1 -1;  kopt: kv;  com
mitid: 13ec4309916b75eb;  filename: abc;
no message
----------------------------
revision 1.1.1.1.2.1
date: 2005/08/19 01:03:50;  author: Admin;  state: Exp;  lines: +18 -18;  kopt: kv;  c
ommitid: 5b8443052ff527b3;  filename: abc;
no message
----------------------------
revision 1.2.4.1
date: 2006/08/23 08:40:12;  author: Admin;  state: Exp;  lines: +147 -32;  kopt: kv;  comm
itid: 45444ec145d23e2;  filename: abc;
no message

这些信息太过杂乱, 我想突出显示的是日期和作者, grep 不能轻松地让你得到. 这就需要对匹配的部分强行加入颜色编码, 然后再送给终端驱动来突出显示

sed
===

cvs log -N abc | sed 's#date: \(.*author: [^;]*\)#date: \x1b[1;31m\1\x1b[1;37m#'

注意不要尝试用\033 的八进制表示法来代替输入\x1b, 因为sed用\0表示整个匹配的字符串, 结果一定不是你想要的.

通过grep 的上下文显示功能, 还是可以近似地得到预期:
cvs log -N abc | grep --color -C100 -P '(?<=date:) .*author: [^;]*'
-C100 使得grep能输出足够多的上下文以供查看, 当然grep要足够聪明不重复显示这些上下文
阅读(1288) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~