首先熟悉顏色代碼的“通用”表示:
對於兩位的數字:
第一位數字為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;31m1x1b[1;37m#'
注意不要嘗試用33 的八進制表示法來代替輸入x1b, 因為sed用表示整個匹配的字符串, 結果一定不是你想要的。
通過grep 的上下文顯示功能, 還是可以近似地得到預期:
cvs log -N abc | grep --color -C100 -P '(?<=date:) .*author: [^;]*'
-C100 使得grep能輸出足夠多的上下文以供查看, 當然grep要足夠聰明不重復顯示這些上下文。