如何在终端中打印带颜色的文本

echo命令


echo是终端下最常用的命令之一,用于在显示器上显示一段文字。一般格式为: echo [ -option ] 字符串

它有2个常用的选项,一个是-n,另一个是-e,下面的图就是 man echo 的结果:

image

echo将字符串输出后是会自动换行的,如果不想换行就需要加上-n选项。

-e的作用是强大的,想要输出有颜色的文字就不得不用借助于-e了。为什么要带颜色?看看下图就知道了

image

都是毛大头,快速辨别的方法就是看数字和颜色。如若看不到数字,单看颜色也能一眼辨别。

 

-e:启用反斜线控制字符的转换,echo 命令所支持的反斜线控制字符如下图:

image

\\:反斜线本身
\a:ALERT / BELL (从系统喇叭送出铃声)
\b:BACKSPACE,退格键
\c:取消行末换行符号(跟-n的作用一样)
\e:ESCAPE键
\f:FORMFEED,换页字符
\n:NEWLINE,换行字符
\r:RETURN,回车键
\t:TAB,表格跳位键
\v:VERTICAL TAB,垂直表格跳位键
\0NNN:ASCII 八进位编码
\xHH:ASCII 十六进位编码

 

# echo $?
//显示最后运行的命令的结束代码(返回值)

 

give you some color see see


在终端可以这样做:

echo -e "\033[31mhello"
echo -e "\033[31mhello\033[0m"

\e[0m会将颜色重新置回,什么时候想重置就什么时候加。

 

echo -e "\033[31mhello"
echo -e "\e[31mhello"

显示的效果是一样的,因为\033和\e是一样的。怎么一样呢?

echo -e "\e"    // 表示键盘左上角的Esc键
echo -e "\033"  // 八进制转义,表示Esc键
echo -e "\x1b"  // 16进制转义,表示Esc键

 

echo -e "\e[31mhello"
echo -e "\e[32mhello"

控制前景色的就是31这个位置的具体数字。

 

另外,GitHub上一个叫cecho的项目,能够方便地实现彩色打印。

 

在C程序中可以这样做:

#include <stdio.h>
int main()
{
    printf("\033[35mabc\n");
    printf("\e[31mdef\e[0m\n");
}

运行后可以看到紫色的abc和红色的def:

 

 

why?


终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能。

和具体的语言无关,所以C语言中的 printf/fprintf 函数也可以这样使用。

本文最重要的一句话,所有的问题都在这里,看明白了就知道怎么改变文本的显示方式了:

\033[显示方式;前景色;背景色m

把\033换成\e是一样的:

\e[显示方式;前景色;背景色m

解释:

①颜色的转义序列是以 ESC 开头

②显示方式:0(默认值)、1(高亮)、

22(非粗体)、4(下划线)、24(非下划线)、5(闪烁)、25(非闪烁)、7(反显)、27(非反显)

③前景色:

30(黑色)、31(红色)、32(绿色)、 33(黄色)、34(蓝色)、35(洋红)、36(青色)、37(白色)

④背景色:

40(黑色)、41(红色)、42(绿色)、 43(黄色)、44(蓝色)、45(洋红)、46(青色)、47(白色)

⑤\033[0m表示默认,可以关闭前边设置的任何效果

image

 

注意:echo的字符串这时必须用引号括起来。

image

 

\033[ 的其他格式


 \033[nA   光标上移n行 
\03[nB    光标下移n行 
\033[nC   光标右移n行 
\033[nD   光标左移n行 
\033[y;xH 设置光标位置 
\033[2J   清屏 
\033[K    清除从光标到行尾的内容 
\033[s    保存光标位置 
\033[u    恢复光标位置 
\033[?25l 隐藏光标 
\33[?25h  显示光标

 

C语言的 printf 函数也好色


 为了人性化地在 printf 函数中进行着色输出,可以定义成一系列的宏。下边的宏定义不是我写的,来自这篇博客:

http://www.cnblogs.com/clover-toeic/p/4031618.html

#define NONE                 "\e[0m"
#define BLACK                "\e[0;30m"
#define L_BLACK              "\e[1;30m"
#define RED                  "\e[0;31m"
#define L_RED                "\e[1;31m"
#define GREEN                "\e[0;32m"
#define L_GREEN              "\e[1;32m"
#define BROWN                "\e[0;33m"
#define YELLOW               "\e[1;33m"
#define BLUE                 "\e[0;34m"
#define L_BLUE               "\e[1;34m"
#define PURPLE               "\e[0;35m"
#define L_PURPLE             "\e[1;35m"
#define CYAN                 "\e[0;36m"
#define L_CYAN               "\e[1;36m"
#define GRAY                 "\e[0;37m"
#define WHITE                "\e[1;37m"

#define BOLD                 "\e[1m"
#define UNDERLINE            "\e[4m"
#define BLINK                "\e[5m"
#define REVERSE              "\e[7m"
#define HIDE                 "\e[8m"
#define CLEAR                "\e[2J"
#define CLRLINE              "\r\e[K" //or "\e[1K\r"

使用时就像这样:

printf(RED "RED " L_RED "L_RED\n" NONE);

 

附录-ASCII码表


ASCII码表
八进制十六进制十进制字符八进制十六进制十进制字符
00 00 0 nul 100 40 64 @
01 01 1 soh 101 41 65 A
02 02 2 stx 102 42 66 B
03 03 3 etx 103 43 67 C
04 04 4 eot 104 44 68 D
05 05 5 enq 105 45 69 E
06 06 6 ack 106 46 70 F
07 07 7 bel 107 47 71 G
10 08 8 bs 110 48 72 H
11 09 9 ht 111 49 73 I
12 0a 10 nl 112 4a 74 J
13 0b 11 vt 113 4b 75 K
14 0c 12 ff 114 4c 76 L
15 0d 13 cr 115 4d 77 M
16 0e 14 so 116 4e 78 N
17 0f 15 si 117 4f 79 O
20 10 16 dle 120 50 80 P
21 11 17 dc1 121 51 81 Q
22 12 18 dc2 122 52 82 R
23 13 19 dc3 123 53 83 S
24 14 20 dc4 124 54 84 T
25 15 21 nak 125 55 85 U
26 16 22 syn 126 56 86 V
27 17 23 etb 127 57 87 W
30 18 24 can 130 58 88 X
31 19 25 em 131 59 89 Y
32 1a 26 sub 132 5a 90 Z
33 1b 27 esc 133 5b 91 [
34 1c 28 fs 134 5c 92 \
35 1d 29 gs 135 5d 93 ]
36 1e 30 re 136 5e 94 ^
37 1f 31 us 137 5f 95 _
40 20 32 sp 140 60 96 '
41 21 33 ! 141 61 97 a
42 22 34 " 142 62 98 b
43 23 35 # 143 63 99 c
44 24 36 $ 144 64 100 d
45 25 37 % 145 65 101 e
46 26 38 & 146 66 102 f
47 27 39 ` 147 67 103 g
50 28 40 ( 150 68 104 h
51 29 41 ) 151 69 105 i
52 2a 42 * 152 6a 106 j
53 2b 43 + 153 6b 107 k
54 2c 44 , 154 6c 108 l
55 2d 45 - 155 6d 109 m
56 2e 46 . 156 6e 110 n
57 2f 47 / 157 6f 111 o
60 30 48 0 160 70 112 p
61 31 49 1 161 71 113 q
62 32 50 2 162 72 114 r
63 33 51 3 163 73 115 s
64 34 52 4 164 74 116 t
65 35 53 5 165 75 117 u
66 36 54 6 166 76 118 v
67 37 55 7 167 77 119 w
70 38 56 8 170 78 120 x
71 39 57 9 171 79 121 y
72 3a 58 : 172 7a 122 z
73 3b 59 ; 173 7b 123 {
74 3c 60 < 174 7c 124 |
75 3d 61 = 175 7d 125 }
76 3e 62 > 176 7e 126 ~
77 3f 63 ? 177 7f 127 del
posted @ 2016-03-03 20:40  luoxu34  阅读(2091)  评论(0编辑  收藏  举报