随笔 - 934, 文章 - 0, 评论 - 249, 阅读 - 345万

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

在终端控制台输出带颜色的文本

Posted on   蝈蝈俊  阅读(3631)  评论(0编辑  收藏  举报

Linux下终端控制台字体颜色

在使用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转义序列。

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

    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
颜色 绿

 

演示代码非常简单,直接按照上面组合输入就行:

fmt.Println("\033[31;4mRed Underline Text\033[0m\n")

下面有对这个功能的简单封装:

https://github.com/xcltapestry/xclpkg/blob/master/clcolor/clcolor.go

 

 

参考资料:

Linux终端输出颜色控制
http://blog.chinaunix.net/uid-29555318-id-4479619.html

给终端来点彩色(c语言和Golang版)
http://studygolang.com/articles/2032

Linux终端输出颜色控制
http://ju.outofmemory.cn/entry/26528

 

WIN下终端控制台字体颜色

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

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

WIN下控制台输出带颜色的文本:

代码:

package main

import (
    "fmt"
    "syscall"
)

type (
    HANDLE uintptr
    WORD   uint16
    DWORD  uint32
)

const (
    STD_OUTPUT_HANDLE    = 0xFFFFFFF5
    FOREGROUND_BLUE      = 0x01
    FOREGROUND_GREEN     = 0x02
    FOREGROUND_RED       = 0x04
    FOREGROUND_INTENSITY = 0x08
    BACKGROUND_BLUE      = 0x10
    BACKGROUND_GREEN     = 0x20
    BACKGROUND_RED       = 0x40
    BACKGROUND_INTENSITY = 0x80
)

var (
    modkernel32                 = syscall.NewLazyDLL("kernel32.dll")
    procGetStdHandle            = modkernel32.NewProc("GetStdHandle")
    procSetConsoleTextAttribute = modkernel32.NewProc("SetConsoleTextAttribute")
)

func GetStdHandle(nStdHandle DWORD) HANDLE {
    ret, _, _ := procGetStdHandle.Call(uintptr(nStdHandle))
    return HANDLE(ret)
}
func SetConsoleTextAttribute(hConsoleOutput HANDLE, wAttributes WORD) bool {
    ret, _, _ := procSetConsoleTextAttribute.Call(
        uintptr(hConsoleOutput),
        uintptr(wAttributes))
    return ret != 0
}
func main() {
    for color := 0; color < 8; color++ {
        textbackground(color)
        fmt.Printf("This is color %d\n", color)
        fmt.Printf("Press any key to continue\n")
        fmt.Scanln()
    }
}
func textbackground(color int) {
    hOut := GetStdHandle(STD_OUTPUT_HANDLE)
    SetConsoleTextAttribute(hOut, WORD(color))
}

执行效果截图:

image

 

参考资料:

Python实现修改Windows CMD命令行输出颜色(完全解析)
http://my.oschina.net/bluefly/blog/311209

Linux终端和win32控制台文本颜色输出
http://www.cnblogs.com/crabxx/p/4046498.html

Golang如何在终端输出带颜色的字体?
http://www.epooll.com/archives/770/

编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
历史上的今天:
2011-01-22 Centos 下查看服务器CPU的信息
点击右上角即可分享
微信分享提示