在使用putty、secureCRT、XShell等终端仿真器连接linux系统时,ls、vim等工具的输出都含有各种颜色,这些颜色的输出大大地增强了文本的可读性。

通常我们可以使用echo命令加-e选项输出各种颜色的文本,例如:echo -e "\033[31mRed Text\033[0m",可以输出红色的字体“Red Text”。其中:"\033[31m"和"\033[0m"是ANSI转义序列(ANSI escape code/sequence),它控制文本输出的格式、颜色等,大多数的类unix终端仿真器都能够解释ANSI转义序列。

1. ANSI颜色序列格式

通用的控制文本颜色的转义序列格式如下:

CSI n1 [;n2 [;…]] m

其中CSI全称为“控制序列引导器”(Control Sequence Introducer/Initiator),也就是上述示例中的"\033["(其中\033是你键盘左上角Esc键对应的ascii码(八进制));n1、n2等表示SGR参数(下面会列出一些常用的SGR参数),用于控制颜色、粗体、斜体、闪烁等文本输出格式;m表示转义序列结束。

注:\033是键盘左上角Esc键对应的ASCII码(8进制),\033、\x1b和\e效果一样, 例如:echo -e "\x1b[31mRed Text\e[0m"也输出红色字体“Red Text”

常用的SRG参数列表如下:

编码

说明

0

关闭所有格式,还原为初始状态

1

粗体/高亮显示

2

模糊(

3

斜体(

4

下划线(单线)

5

闪烁(慢)

6

闪烁(快)(

7

交换背景色与前景色

8

隐藏(伸手不见五指,啥也看不见)(

30-37

前景色,即30+x,x表示不同的颜色(参见下面的“颜色表”)

40-47

背景色,即40+x,x表示不同的颜色(参见下面的“颜色表”)

注:(1)其中含有(※)标注的编码表示不是所有的终端仿真器都支持,只有少数仿真器支持。

(2)多个SGR参数可以组合使用,例如:echo -e "\x1b[31;4mRed Underline Text\e[0m"输出红色下划线字体“Red Underline Text”。

(3)更多参数信息请参考“ANSI escape code”。

颜色表:

颜色值x

0

1

2

3

4

5

6

7

颜色

绿

2. 各种语言输出颜色文本示例

除了shell命令可输出颜色,其它语言中也可以使用上述ANSI转义序列输出颜色(前提是你使用的终端仿真器能够解析ANSI转义序列),以下给出几种主要语言中输出颜色文本的示例。

注:以下程序仅针对类unix终端有效,win32控制台不支持ANSI转义序列,因而无效。

2.1 C程序输出颜色示例

 // hello.c
#include <stdio.h>
int main() {
printf("\033[31;4mRed Underline Text\033[0m\n");
}

编译:gcc hello.c

运行:./a.out

输出:Red Underline Text

2.2 C++程序中输出颜色示例

 // hello.cpp
#include <iostream>
int main() {
std::cout << "\033[31;4mRed Underline Text\033[0m" << std::endl;
}

编译:g++ hello.cpp

运行:./a.out

输出:Red Underline Text

2.3 Java程序中输出颜色示例

 // hello.java
class hello {
public static void main(String[] args) {
System.out.println("\033[31;4mRed Underline Text\033[0m");
}
}

注:Java中不能识别\e和\0x1b,仅可使用\033。

编译:javac hello.java

运行:java hello

输出:Red Underline Text

2.4 Python程序中输出颜色示例

 # hello.py
print "\033[31;4mRed Underline Text\033[0m"

注:python(v2.6.5)中不能识别\e,可以使用\033和\x1b。

运行:python hello.py

输出:Red Underline Text

3. win32控制台程序输出颜色

由于win32控制台不支持ANSI转义序列,因此要让win32控制台输出颜色文本相对复杂一些。

3.1 C/C++ windows程序控制台输出颜色

借助SetConsoleTextAttribute和GetStdHandle两个win32 API函数输出颜色,示例如下:

 #include <stdio.h>
#include <windows.h> int main() {
HANDLE hdl = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hdl, FOREGROUND_RED | FOREGROUND_INTENSITY);
printf("Hello ");
SetConsoleTextAttribute(hdl, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
printf("world!\n"); getchar();
}

其中用到的两个API原型如下:

 HANDLE GetStdHandle(DWORD nStdHandle);
BOOL SetConsoleTextAttribute(HANDLE hConsoleOutput, WORD wAttributes);

其中,GetStdHandle用于获取屏幕缓冲区句柄(示例中获取的是标准输出的句柄),SetConsoleTextAttribute用于设置控制台文本属性(第一次调用时设置前景色为红色高亮,第二次调用时设置为绿色高亮),因此输出结果为“Hello world!”。

GetStdHandle接口参数nStdHandle与接口返回值的含义如下:

值(nStdHandle

含义

STD_INPUT_HANDLE

返回标准输入的句柄

STD_OUTPUT_HANDLE

返回标准输出的句柄

STD_ERROR_HANDLE

返回标准错误的句柄

注:更多信息请参考“GetStdHandle”。

SetConsoleTextAttribute()第一个参数hConsoleOutput为屏幕缓冲区句柄(可通过GetStdHandle()获取),第二个参数wAttributes为颜色属性。常用颜色属性值如下(可组合使用):

属性(wAttributes

说明

FOREGROUND_BLUE

前景色(蓝色)

FOREGROUND_GREEN

前景色(绿色)

FOREGROUND_RED

前景色(红色)

FOREGROUND_INTENSITY

前景色高亮

BACKGROUND_BLUE

背景色(蓝色)

BACKGROUND_GREEN

背景色(绿色)

BACKGROUND_RED

背景色(红色)

BACKGROUND_INTENSITY

背景色高亮

注:更多信息请参考“Console Screen Buffers”。

3.2 命令提示符下调整整屏颜色

命令提示符(CMD)下调整整屏颜色输出可使用color命令,格式如下:

color BF

其中B和F表示颜色属性(B背景色,F前景色),属性值为一个十六进制数字(0-F)。各属性值与颜色对应的关系如下:

属性值

0

1

2

3

4

5

6

7

颜色

绿

水绿

属性值

8

9

A

B

C

D

E

F

颜色

淡蓝

淡绿

淡水绿

淡红

淡紫

淡黄

亮白

例如,要设置命令提示符窗口“背景色为绿色,前景色为蓝色”可执行“color 21”。

3.3 PowerShell下输出字符颜色

可参考:PowerShell输出字符颜色

3.4 Python绑定windows接口输出显色

可参考:Python实现修改Windows CMD命令行输出颜色(完全解析)

Linux终端和win32控制台文本颜色输出的更多相关文章

  1. PS1应用之——修改linux终端命令行各字体颜色

    最近在学习linux操作系统(CentOS 6 & CentOS 7).觉得linux终端命令行全部为白色,会经常导致命令与输出内容难以分辨.于是上网找到修改linux终端命令行颜色的方法,发 ...

  2. 修改linux终端命令行各字体颜色

    这里我用的是 CentOS 7.5,觉得linux终端命令行全部为白色,会经常导致命令与输出内容难以分辨.于是上网找到修改linux终端命令行颜色的方法,发现通过定义PS1环境变量即可实现,下面我以r ...

  3. C#更改控制台文本颜色

    C#更改控制台文本的前景色和背景色   关键字:C# NET 控制台 前景色 背景色地址:http://www.cnblogs.com/txw1958/archive/2012/12/07/cshar ...

  4. Linux终端提示符PS1设置(颜色)

    \d :代表日期,格式为weekday month date,例如:"Mon Aug 1"\H :完整的主机名称.例如:我的机器名称为:fc4.linux,则这个名称就是fc4.l ...

  5. 通过printf设置Linux终端输出的颜色和显示方式

    转载自:http://www.cnblogs.com/clover-toeic/p/4031618.html 在Linux终端下调试程序时,有时需要输出大量信息.若能控制字体的颜色和显示方式,可使输出 ...

  6. linux 终端输出颜色

    在Linux终端下调试程序时,有时需要输出大量信息.若能控制字体的颜色和显示方式,可使输出信息对比鲜明,便于调试时观察数据. 终端的字符颜色由转义序列(Escape Sequence)控制,是文本模式 ...

  7. 花里胡哨,如何在Linux终端输出带有颜色的字体,将带颜色的字体赋值给变量

    背景 ​ 在日常操作Linux的情况下,总会遇到一些需求,比如说,把输出的内容用不同颜色标注出来,以达到醒目.提示的目的,那么如何在Linux终端输出带有颜色的字体呢? Linux终端输出字符颜色 ​ ...

  8. ANSI最全介绍linux终端字体改变颜色等

    ANSI转义序列 维基百科,自由的百科全书 由于国内不能访问wiki而且国内关于ANSI的介绍都是简短的不能达到,不够完整所以转wiki到此博客,方便国内用户参考,原地址(https://zh.wik ...

  9. linux终端颜色控制

    引言: 由于在c代码中看到过打印彩色字, 又对PS1 想进一步了解,才有了这篇博文.----------------------------------------Linux 终端控制台字体颜色  - ...

随机推荐

  1. ipython 导入模块 非法ascii字符问题

    SyntaxError: Non-ASCII character '\xe2‘ ipython  使用了 python2    加入 #coding=utf-8 ipython3 使用 python3

  2. (STM32F4) SysTick理解使用

    關於Cortex System Timer (Systick) 網上隨便google就可以找到許多相關範例. 他就是ARM提供的一個24-bit的下數(count-down)計時器我看大部分應用都是提 ...

  3. 关闭tensorflow运行时的警告信息

    执行简单的矩阵相乘的程序: import tensorflow as tf m1 = tf.constant([[3,3]]) m2 = tf.constant([[2],[3]]) product ...

  4. python之类与对象(3)

    4. 类的初始化函数__init__(): 本章参考:https://blog.csdn.net/hellocsz/article/details/82795514  原作者: hellocsz 总结 ...

  5. 进阶篇:4.4)DFA设计指南:面向高速自动化装配设计

    本章目标:更进一步,设计出符合高速自动化装配的零件. 1.前言 中国的人口红利时代正在慢慢地过去,这是事实.同时,机器换人与大自动化的时代也在到来. 在这个时代中,人工成本越来越高,零部件的装配和库存 ...

  6. node爬取页面元素

    /** * Created by on 2018/12/25. */const http = require("https");const fs = require('fs'); ...

  7. css实现视觉差的滚动

    之前在逛知乎的时候,发现知乎app首页中偶尔掺杂的广告图片,都是做的视觉差的效果,广告图片的向上速度明显比外面页面的上拉速度慢了很多,看起来很炫酷,然后在网上看了下,发现有很多js插件可以实现这种效果 ...

  8. 1095. Maximum Swap —— Weekly Challenge

    题目限定输入是[0, 10^8],因而不用考虑负数或者越界情况,算是减小了难度. public class Solution { /** * @param num: a non-negative in ...

  9. es第十篇:Elasticsearch for Apache Hadoop

    es for apache hadoop(elasticsearch-hadoop.jar)允许hadoop作业(mapreduce.hive.pig.cascading.spark)与es交互. A ...

  10. 【OpenCV-Python】-图像阀值

    参考:Opencv官方教程 1.简单阀值 cv2.threshold , cv2.adaptiveThreshold当像素值高于阀值时,我们给这个像素赋予一个新值(可能是白色),否则我们给它赋予另外一 ...