Linux Shell输出颜色字符学习笔记(附Python脚本实现自动化定制生成)

时间:2022-11-29 19:40:50

齿轮发出咔嚓一声,向前进了一格。而一旦向前迈进,齿轮就不能倒退了。这就是世界的规则。

0x01背景

造了个*:御剑师傅的ipintervalmerge的Python版本。觉得打印的提示信息如果是普通格式显示的话,有些LOW,就想要打印颜色字符,于是有了这篇学习笔记。

0x02 原理及格式

原理:

Shell的字符颜色是由转义字符控制的,是系统的输出格式,与具体的编程语言无关。也就是说无论使用何种编程语言,只要按照Shell的输出格式打印输出,就会得到想要的效果。

格式:

\033[n1;n2;n3..m

含义:
转义字符以ESC开头,即\033(ESC的ASCII码为27,自然它的八进制表示就33咯)
n1、n2、n3..代表数字,控制显示方式,前景色,背景色等等;m作为结束。

0x03 显示方式

n 显示方式
0 缺省值
1 粗体
21 非粗体(即取消粗体)
2 加深颜色(描述可能不准确,具体效果见图)
22 取消加深颜色
3 斜体
23 取消斜体
4 下划线
24 取消下划线
5、6 测试没有任何效果
7 反亮显示
27 取消反亮显示

测试:
Linux Shell输出颜色字符学习笔记(附Python脚本实现自动化定制生成)

0x04 前景色

n 前景色
30 黑色
31 红色
32 绿色
33 黄色
34 蓝色
35 紫色
36 青色
37 白色

测试(使用了粗体,效果更明显):
Linux Shell输出颜色字符学习笔记(附Python脚本实现自动化定制生成)

0x05 背景色

n 背景色
40 黑色
41 红色
42 绿色
43 黄色
44 蓝色
45 紫色
46 青色
47 白色

测试:
Linux Shell输出颜色字符学习笔记(附Python脚本实现自动化定制生成)

0x06 Python脚本实现自动化定制生成

S={'S0':0,'S1':1,'S2':2,'S3':3,'S4':4,'S7':7} #Style
F={'F0':30,'F1':31,'F2':32,'F3':33,'F4':34,'F5':35,'F6':36,'F7':37} #Forecolor
B={'B0':40,'B1':41,'B2':42,'B3':43,'B4':44,'B5':45,'B6':46,'B7':47} #Backcolor

menu='''\033[1;31m[-]S0:Default   [-]S1:Bold    [-]S2:Deepen    [-]S3:Italic
[-]S4:Underline [-]S7:Reversal\033[0m

\033[1;33m[-]F0:Black     [-]F1:Red     [-]F2:Green     [-]F3:Yellow
[-]F4:Blue      [-]F5:Purple  [-]F6:Cyan      [-]F7:White\033[0m

\033[1;36m[-]B0:Black     [-]B1:Red     [-]B2:Green     [-]B3:Yellow
[-]B4:Blue      [-]B5:Purple  [-]B6:Cyan      [-]B7:White\033[0m'''

def main(match,print_string):
    match_list=match.split('+')
    color_string='\033['
    if len(match_list)==1:
        i=-1
    for i in range(len(match_list)-1):
        color_string+=str(eval(match_list[i][0].upper())[match_list[i].upper()])+';'
    color_string+=str(eval(match_list[i+1][0].upper())[match_list[i+1].upper()])+'m'+print_string+'\033[0m'
    return color_string
if __name__ == '__main__':
    print(menu)
    match=input("\033[1;35mPlease enter your desired match:\033[0m")
    print_string=input("\033[1;35mPlease enter the string you want to print:\033[0m")
    print(main(match,print_string))

再补充一个批量的脚本:

import shell_color
import argparse
def main(read_file,write_file):
    match_file=open(read_file,'r')
    match_list=match_file.read().split('\n')
    new_file=open(write_file,'w',encoding='utf8')
    if len(match_list)!=0:
        for match_item in match_list:
            if match_item!='':
                match,write_string=match_item.split(' ')
                new_file.write(shell_color.main(match,write_string)+'\n')
if __name__ == '__main__':
    parser=argparse.ArgumentParser()
    parser.add_argument('-r',help='Match File Path')
    parser.add_argument('-w',help='Write File Path')
    args=parser.parse_args()
    if args.r and args.w:
        main(args.r,args.w)

Usage:
Linux Shell输出颜色字符学习笔记(附Python脚本实现自动化定制生成)

test.txt是你已经写好的要批量生成的格式及内容:
Linux Shell输出颜色字符学习笔记(附Python脚本实现自动化定制生成)

1.txt是你要保存的文件名:
Linux Shell输出颜色字符学习笔记(附Python脚本实现自动化定制生成)

虽然是乱码,但是输出还是正常的:
Linux Shell输出颜色字符学习笔记(附Python脚本实现自动化定制生成)