如何在终端中打印带颜色的文本
echo命令
echo是终端下最常用的命令之一,用于在显示器上显示一段文字。一般格式为: echo [ -option ] 字符串
它有2个常用的选项,一个是-n,另一个是-e,下面的图就是 man echo 的结果:
echo将字符串输出后是会自动换行的,如果不想换行就需要加上-n选项。
-e的作用是强大的,想要输出有颜色的文字就不得不用借助于-e了。为什么要带颜色?看看下图就知道了
都是毛大头,快速辨别的方法就是看数字和颜色。如若看不到数字,单看颜色也能一眼辨别。
-e:启用反斜线控制字符的转换,echo 命令所支持的反斜线控制字符如下图:
\\:反斜线本身
\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表示默认,可以关闭前边设置的任何效果
注意:echo的字符串这时必须用引号括起来。
\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 |