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

Posted luoxu34

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在终端中打印带颜色的文本相关的知识,希望对你有一定的参考价值。

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

以上是关于如何在终端中打印带颜色的文本的主要内容,如果未能解决你的问题,请参考以下文章

C 代码更改终端文本颜色;如何恢复默认值? Linux

在python终端中打印颜色[重复]

如何从 python 打印 \[ 和 \] 到终端?

Linux终端打印文本色彩

python3使用print打印带颜色的字符串

chalk插件 使终端输出的字带颜色