科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道如何成为一个UNIX系统的“好色”之徒

如何成为一个UNIX系统的“好色”之徒

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文将教大家如何成为一个UNIX系统的“好色”之徒。

作者:lynn 来源:赛迪网 2008年6月25日

关键字: 命令行 Linux 技巧

  • 评论
  • 分享微博
  • 分享邮件

首先熟悉颜色代码的“通用”表示:

对于两位的数字:

第一位数字为3表示定义的是前景色, 为4表示背景色。
第二位数字定义具体的颜色. 1 为Red, 2为Green, 3为Blue, 0表示黑色。

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

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

以上所说的"通用"是一般的字符终端的驱动所理解的颜色代码的表示法, 当然, 颜色表示必需是一个比较少会出现的特殊字符序列开始的. 这个序列是:

[[ 其中^[的ASCII的27, 也就是通过由Escape输入的值, 在终端命令行上, 需要用〈C-V〉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要足够聪明不重复显示这些上下文。

相关文章:

Shell----UNIX系统的命令直译器

UNIX系统如何防范系统崩溃

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章