Linux正则表达式和三剑客grep、awk、sed。
1.自动补全文件名:输入前面几个字母点击:tab键补全
2.创建目录:mkdir;(删除目录:rmdir) 创建文件:vi ; a进入编辑页面;esc退出编辑页面;
:wq保存 :w filename 保存至指定文件名 :q 不保存直接退出
3。pwd :当前目前绝对路径
4.chmod :授权 (文件拥有者:u:User,g:Group,o:Other,a:All,)(文件权限:r:读:数字代号为"4",w:写:数字代号为"2"。r:执行:数字代号为"1")(+:增权限,-:删权限):chmod a+rwx filename 给文件增加读写和执行的权限
5.cp file1 file2 (copy文件1至2)
6.cat aa.txt bb.txt >> all.txt 合并文件
7.配置网关地址:
第一步:ip addr 获取ip地址
第二步:vi /etc/sysconfig/network-scripts/ifcfg-ens33,然后编辑文件 : ifcfg-ens33
第四步:systemctl restart network
重启网络命令
第五步:reboot
重启虚拟机命令
sed 的工作流程主要包括读取、执行和显示三个过程。
读取:sed 从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)。
执行:默认情况下,所有的 sed 命令都在模式空间中顺序地执行,除非指定了行的地址,否则 sed 命令将会在所有的行上依次执行。
显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。
-e 表示用指定命令或者脚本来处理输入的文本文件,只有一个编辑命令时可省略
-f 表示用指定的脚本文件来处理输入的文本文件
-n 表示仅显示处理后的结果
-i.bak 直接编辑文本文件,不输出结果
-r, -E 使用扩展正则表达式
-s 将多个文件视为独立文件,而不是单个连续的长文件流
a:增加,在当前行下面增加一行指定内容。
c:替换,讲选定行替换为指定内容。
d:删除,删除选定的行。
i:插入,在选定行上面插入一行指定内容。
p:打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容,如果又非打印字符,则以ASCLL码输出。通常与“-n”选项一起使用。
s:替换,替换指定字符
y:字符转换
sed两种基本语法,常用一种为,此处仅展示此种情况:
sed [选项] '操作' 参数
选项:n:表示仅显示处理后的结果
操作:p:打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容,如果又非打印字符,则以ASCLL码输出。
常用:sed -n '3p' passwd.txt //输出第 3 行
sed -n 'p' passwd.txt //输出所有内容,等同于 cat test.txt
sed -n '3p' passwd.txt //输出第 3 行
sed -n '3,5p' passwd.txt //输出 3~5 行
sed -n 'p;n' passwd.txt //输出所有奇数行,n 表示读入下一行资料
sed -n 'n;p' passwd.txt //输出所有偶数行,n 表示读入下一行资料
sed -n '1,5{p;n}' passwd.txt //输出第 1~5 行之间的奇数行(第 1、3、5 行)
sed -n '10,${n;p}' passwd.txt //输出第 10 行至文件尾之间的偶数行
sed -n '2,+3p' passwd.txt //从第2行开始,连续3行进行输出,即输出2~5行
--正则:以“/”包围
sed -n '/the/p' text.txt //输出包含the 的行
sed -n '2,/the/p' text.txt //输出从第 4 行至第一个包含 the 的行
sed -n '/the/=' text.txt //输出包含the 的行所在的行号,等号(=)用来输出行号
sed -n '/^PI/p' text.txt //输出以PI 开头的行
sed -n '/[0-9]$/p' text.txt //输出以数字结尾的行
sed -n '/\/p' text.txt //输出包含单词wood 的行
操作:a:增加,在当前行下面增加一行指定内容。i:插入,在选定行上面插入一行指定内容。
sed '/the/i 有手就行' text.txt //在含有the行的前面一行添加有手就行
sed '/the/a 有手\n就行' text.txt //在含有the行的下一行添加有手就行(\n换行)
sed '3a看看就会' text.txt //在第3行之后插入字符
操作:d:删除,删除选定的行。
nl命令用于计算文件的行数,结合该命令可以更加直观地查看到命令执行的结果。
nl text.txt | sed '3d' //删除第3行
nl text.txt | sed '3,5d' //删除第3~5行
nl text.txt |sed '/cross/d' //删除包含 cross 的行,原本的第 8 行被删除;如果要删除不包含 cross 的行,用!符号表示取反操作, 如'/cross/!d'
sed '/^[a-z]/d' text.txt //删除以小写字母开头的行
sed '/\.$/d' text.txt //删除以.结尾的行
操作:s:替换,替换指定字符
使用场景:生成数据脱敏
sed 's/the/THE/' text.txt //将每行中的第一个the 替换为 THE
sed 's/l/L/2' text.txt //将每行中的第 2 个 l 替换为 L
sed 's/the/THE/g' text.txt //将文件中的所有the 替换为 THE
sed 's/o//g' text.txt //将文件中的所有o 删除(替换为空串)
sed 's/^/#/' text.txt //在每行行首插入#号
sed '/the/s/^/#/' text.txt //在包含the 的每行行首插入#号
sed '3,5s/the/THE/g' text.txt //将第 3~5 行中的所有 the 替换为 THE
sed '/the/s/o/O/g' text.txt //将包含the 的所有行中的 o 都替换为 O
操作:H:复制到剪贴板;
g、G:将剪贴板中的数据覆盖/追加至指定行;
w:保存为文件;
r:读取指定文件;
a:追加指定内容。具体操作方法如下所示。
I,i 忽略大小写
sed '/the/{H;d};$G' text.txt //将包含the 的行迁移至文件末尾,{;}用于多个操作
sed '1,5{H;d};14G' text.txt //将第 1~5 行内容转移至第 17 行后
sed '/the/w out.file' text.txt //将包含the 的行另存为文件 out.file
sed '/the/r /etc/hostname' text.txt //将文件/etc/hostname 的内容添加到包含 the 的每行以后
sed '3aNew' text.txt //在第 3 行后插入一个新行,内容为New
sed '/the/aNew' text.txt //在包含the 的每行后插入一个新行,内容为 New
sed '3aNew1\nNew2' text.txt //在第 3 行后插入多行内容,中间的\n 表示换行
常用于扫描、过滤、统计汇总工作。执行结果可以通过print的功能将字段数据打印显示
● sed命令常用于一整行的处理,而awk比较倾向于将一行分成多个"字段"然后再进行处理,且默认情况下字段的分隔符为空格或tab键。awk 执行结果可以通过print的功能将字段数据打印显示。
●在使用awk命令的过程中,可以使用逻辑操作符"&&“表示"与”、"||“表示"或”、"!“表示"非”;还可以进行简单的数学运算,如+、-、*、/、%、^分别表示加、减、乘、除、取余和乘方。
●awk后面接两个单引号并加上大括号{ }来设置想要对数据进行的处理操作,awk可以处理后续接的文件,也可以读取来自前个命令的标准输。
基本格式两种,与sed一致:
1.awk [选项] ‘模式条件{操作}’ 文件1 文件2 ...
2.awk -f 脚本文件 文件1 文件2…
FS 列分割符。指定每行文本的字段分隔符,默认为空格或制表位。与"-F"作用相同
NF 当前处理的行的字段个数。
NR 当前处理的行的行号(序数)。
$0 当前处理的行的整行内容。
$1 代表第一列的内容
$2 代表第二列的内容
$n 当前处理行的第n个字段
FILENAME 被处理的文件名。
RS 行分隔符
数据记录分隔,默认为\n,即每行为一条记录。
变量:NR:当前处理的行的行号(序数)。
{print}:输出
--输出全部
awk '{print}' test.txt
awk '{print $0}' test.txt
输出 1行和3行
awk 'NR==1,NR==3{print}' test.txt
输出1,2,3行
awk '(NR>=1)&&(NR<=3){print}' test.txt
输出1,3行
awk 'NR==1||NR==3{print}' test.txt
#输出4-8行,或10行
awk '(NR>=4&&NR<=8)||NR==10 {print $0}' test.txt
#输出所有奇数行
awk '(NR%2)==1{print}' test.txt
#输出所有偶数行
awk '(NR%2)==0{print}' test.txt
知识点:1)/^nologin/:以nologin开头 /nologin$/:以nologin结尾
2)wc 命令用于计算字数。
参数:-c, --bytes:统计字节数。
-m, --chars:统计字符数。
-w, --words:统计字数。
-l, --lines:统计行数。
-L, --max-line-length:统计最长行的长度
3)阅读:awk 'BEGIN {x=0}; /nologin$/ {x++; print x, $0}; END {print x}' /etc/passwd
#输出以root开头的行
awk '/^root/{print}' test.txt
#输出以 nologin 结尾的行
awk '/nologin$/{print}' test.txt
#输出不是第10行的所有行
awk 'NR!=10 {print $0}' test.txt
#统计以nologin为结尾的行数
[root@localhost ~]# grep -c "nologin$" /etc/passwd
统计所有nologin结尾的行,并以行计数(只输出多少行的计数)
[root@localhost ~]# awk '/nologin$/ {print $0}' /etc/passwd | wc -l
统计弄哦login结尾的行,并最后输出计数x
[root@localhost ~]# awk 'BEGIN {x=0}; /nologin$/ {x++}; END {print x}' /etc/passwd
统计所有行并输出每行,最后输出计数x
[root@localhost ~]# awk 'BEGIN {x=0}; /nologin$/ {x++; print x, $0}; END {print x}' /etc/passwd
#输出以root开头的行的第一部分:-F: “:”冒号分割
[root@localhost ~]# awk -F: '/^root/ {print $1}' /etc/passwd
#输出以root开头的行的第一部分和第三部分
[root@localhost ~]# awk -F: '/^root/ {print $1,$3}' /etc/passwd
#输出以root开头的行的第一部分和第三部分,最后一部分
[root@localhost ~]# awk -F: '/^root/ {print $1,$3,$NF}' /etc/passwd
#输出第三部分不小于200的行
[root@localhost ~]# awk -F ":" '!($3<200){print}' /etc/passwd
#以冒号为分隔符,第三部分大于等于1000。先处理完BEGIN的内容,再打印文本里面的内容
[root@localhost ~]# awk 'BEGIN {FS=":"};{if($3>=1000){print}}' /etc/passwd
~:表示包含
NF:当前处理的行的字段个数。
#!表示为取反
[root@localhost ~]# awk -F: '!($3>8) {print $3,$1}' /etc/passwd
[root@localhost ~]# awk -F: 'BENGIN {FS=":"}; !($3>8) {print $3,$1}' /etc/passwd
#($3>$4)?$3:$4;三元运算符,如果第3个字段的值大于等于第4个字段的值,则把第3个字段的值赋给max,否则第4个字段的值赋给max
[root@localhost ~]# awk 'BEGIN {FS=":"};{if($3>=1000){print}}' /etc/passwd
#输出以冒号分隔且第7个字段中包含/bash的行的第1个字段,~意思为包含
[root@localhost ~]# awk -F ":" '$7~"/bash"{print $1}' /etc/passwd
#输出第1个字段中包含root且有7个字段的行的第1、2个字段
[root@localhost ~]# awk -F ":" '($1~"root")&&(NF==7){print $1,$2}' /etc/passwd
#输出第7个字段既不为/bin/bash,也不为/sbin/nologin的所有行
[root@localhost ~]# awk -F ":" '($7!="/bin/bash")&&($7!="/sbin/nologin"){print}' /etc/passwd
5.实战应用:free -m | awk '/Mem/ {print $3/$2 * 100"%"} 内存使用率占比
top -b -n1 | awk -F, '/%Cpu/ {print $4}' cpu使用率占比
变量: NR:当前处理的行的行号(序数)。
$0 当前处理的行的整行内容。
$1 代表第一列的内容
$2 代表第二列的内容
$n 当前处理行的第n个字段
FILENAME 被处理的文件名。
RS 行分隔符
#输出行号和内容
[root@localhost ~]# awk '{print NR,$0}' a
#输出行号和内容
[root@localhost ~]# awk '{print NR,$0};END{print NR}' a
#以冒号为分隔符,输出内容和行号
[root@localhost ~]# echo $PATH | awk 'BEGIN{RS=":"}; {print NR,$0}'
#调用w命令,并用来统计在线用户数
[root@localhost ~]# awk 'BEGIN {n=0 ; while ("w" | getline) n++ ; {print n-2}}'
#查询用户名
[root@localhost ~]# awk 'BEGIN {"hostname" | getline ; {print $0}}'
#内存使用率占比
[root@localhost ~]# free -m | awk '/Mem/ {print $3/$2 * 100"%"}
#内存空闲率占比
[root@localhost ~]# free -m | awk '/Mem/ {print ($2-$3)/$2 * 100"%"}'
#cpu使用率占比(awk '{print 100-$1"%"}'执行有问题)
[root@localhost ~]# top -b -n1 | awk -F, '/%Cpu/ {print $4}' | awk '{print 100-$1"%"}'
#查询各种数值的重复次数
[root@localhost ~]# cat test.txt | awk '{a[$1]++};END{for(i in a){print i,a[i]}}'
1.date时间输出 date -d "$(cat /proc/uptime | awk -F. '{print $1}') second ago" +"%Y%m%d %H:%M:%S"
[root@localhost ~]# date -d "1 month" +"%Y/%m/%d" #下个月的今天
[root@localhost ~]# date -d "1 month" +"%Y/%m/01" #下个月第一天
[root@localhost ~]# date +"%Y/%m/01" #当月第一天
[root@localhost ~]# date -d "1 month ago" +"%Y/%m/%d" #一个月前的今天
[root@localhost ~]# date -d "1 day ago" +"%Y/%m/%d" #1天前
[root@localhost ~]# date -d "-1 day " +"%Y/%m/%d" #1天前
[root@localhost ~]# date -d "$(date +%Y%m01) -1 day" +%Y/%m/%d #上个月的最后一天
[root@localhost ~]# date -d "$(date -d "1 month" +%Y%m01) -1 day" +%Y/%m/%d #当月最后一天
[root@localhost ~]# date -d "$(cat /proc/uptime | awk -F. '{print $1}') second ago" +"%Y%m%d %H:%M:%S"
#显示上次系统重启时间,等同于uptime;second ago为显示多少秒前的时间,+"%F %H:%M:%S"等同于+"%Y-%m-%d %H:%M:%S"的时间格式
/proc/uptime 第一列输出的是,系统启动到现在的时间(以秒为单位);第二列输出的是,系统空闲的时间(以秒为单位)
date -d "$(date -d"1 month" +"%Y%m01") -3 day" +"%Y%m%d" 当月倒数第三天
date +"%Y%m01" 当月第一天
2.获取奇数偶数行
知识点:seq 10 输出数字
[root@localhost ~]# seq 10 | awk '{getline; print $0}' #获取偶数行
[root@localhost ~]# seq 10 | awk '{print $0; getline}' #获取奇数行
当getline左右无重定向符“<”或“|”时,awk首先读取到了第一行,就是1,然后getline,就得到了1下面的第二行,就是2,因为getline之后,awk会改变对应的NF,NR,FNR和$0等内部变量,所以此时的$0的值就不再是1,而是2了,然后将它打印出来。
当getline左右有重定向符“<”或“|”时,getline则作用于定向输入文件,由于该文件是刚打开,并没有被awk读入一行,只是getline读入,那么getline返回的是该文件的第一行,而不是隔行。
3.分割符:OFS=“|”指定以“|”为分隔符
#OFS为指定分隔符
[root@localhost ~]# echo "A B C D" | awk '{OFS="|";print $0;$1=$1;print $0}'
#以|为分隔符输出
[root@localhost ~]# echo "A B C D" | awk '{OFS="/";print $0;$1=$1;print $0}'
#以/为分隔符输出
4.数组
#输出数组的下标位为1的数值
[root@localhost ~]# awk 'BEGIN{a[0]=1; a[1]=2; a[2]=3; print a[1]}'
2
#输出数组的下标位为0的数值
[root@localhost ~]# awk 'BEGIN{a[0]=1; a[1]=2; a[2]=3; print a[0]}'
1
#也可以用字符串定义数组
[root@localhost ~]# awk 'BEGIN{a["abc"]=1; a["def"]=2; a["xyz"]=3; print a["abc"]}'
1
[root@localhost ~]# awk 'BEGIN{a["abc"]=1; a["def"]=2; a["xyz"]=3; print a["xyz"]}'
3
#输出数值和下标位
[root@localhost ~]# awk 'BEGIN{a[0]=1; a[1]=2; a[2]=3; for(i in a){print i,a[i]}}'
0 1
1 2
2 3
5.查重
#查询各种数值的重复次数
[root@localhost ~]# cat test.txt | awk '{a[$1]++};END{for(i in a){print i,a[i]}}'
grep命令是一种强大的文本搜索工具,主要考虑grep+正则表达式-->并把匹配的行打印出来。
grep家族: grep, egrep, fgre
正则都要用,这里干脆单独弄一个文章说:
好了,正则知道后:
常见格式:
grep [options] PATTERN [FILE...]
grep [options] PATTERN [FILE...]
-i:忽略大小写
--color:匹配到的字符带颜色
-v::显示没有被模式匹配到的行
-o:只显示被模式匹配到的字符串
-E: 使用扩展正则表达式
-A n: 显示匹配到的行和其后的n行
-B n: 前的n行
-C n: 前后各n行
-n 显示匹配的行号
-w 被匹配的文本只能是单词,而不能是单词中的某一部分
-c 统计匹配的行数,而不是显示被匹配到的内容
-R,-r 查询递归目录下的所有文件
变量:
-w 被匹配的文本只能是单词,而不能是单词中的某一部分
-R,-r 查询递归目录下的所有文件
grep -rw 'root' /etc
以a开头的文件 ^a
grep "^a" test.txt
以a结尾的文件 a$
grep "a$" test.txt
*前面的a出现0次或多次
grep "a*" test.txt
匹配 . 除换行符以外的单个字符
grep "a..a" test.txt
grep "a.a" test.txt
.* 表示任意长度的任一字符,不包括0次
grep "a.*" test.txt
\{n\} 匹配前面的子表达式n次
grep "a\{2\}aa" test.txt
匹配子表达式:a 1次以上
grep -E "a+" test.txt
匹配子表达式:a 0到1次
grep -E "a?" test.txt
匹配子表达式:aaa
grep -E "a(aaa)" test.txt
匹配子表达式:aaa 或者bbb
grep -E "a(aaa)|(bbb)" test.txt
1.内存 >90% ,CPU>80%,磁盘>90%及告警
#!/bin/bash
NC=$(expr $(free | grep "Mem:" | awk '{print $3}') \* 100 / $(free|grep "Mem:"|awk '{print $2}')) #查看内存状态并转化为百分比
CPU=$(expr 100 - $(mpstat |tail -1 | awk '{print $12}' |awk -F. '{print $1}')) #查看CPU状态并提取出百分比数值
CP=$(df -h |grep "/$" |awk '{print $5}'|awk -F% '{print $1}') #查看磁盘状态并提取百分比
GJ="gaojing.txt" #定义一个告警的文件
GJmail="[email protected]" #定义告警需要发送的邮箱
if [ $NC -gt 90 ];then #判断内存是否大于等于百分之90,是就存到告警文件中
echo "内存使用率:$NC% >> $GJ"
fi
if [ $CPU -gt 80 ];then #同理CPU超80就存到告警文件
echo "cpu使用率:$CPU >> $GJ"
fi
if [ $CP -gt 90 ];then #磁盘超过90就存到告警文件
echo "根分区磁盘占用率:$CP >> $GJ"
fi
if [ -f $GJ ];then
cat $GJ | mail -s "警告" $GJmail
rm -rf $GJ
fi
chmod 777 /root/sysmon.sh
echo "*/30 * * * * /root/sysmon.sh" >> /var/spool/cron/root #写一个周期任务每30分钟执行一次脚本监控
2.性能监控脚本(全面,但一般不用这么全面)
#!/bin/bash
#功能描述:监控服务器主要性能参数指标
#监控项目:内核信息、主机名称、ip地址、登录账户、内存与swap信息、磁盘信息、CPU负载
kernel=$(uname -r) #内核信息
release=$(cat /etc/centos-release) #操作系统版本
hostname=$HOSTNAME #主机名称
localip=$(ip a s | awk '/inet /{print $2}'|tail -1) #本地ip地址列表
mem_total=$(free | awk '/Mem/{print $2}') #总内存容量
mem_free=$(free | awk '/Mem/{print $NF}') #剩余内存容量
mem_used=$(free -t | awk 'NR == 2 {printf("%.2f% \n"), $3/$2*100}') #已使用内存百分比
cpu_used=$(top -b -n1 | head -5 | grep ^%Cpu | awk '{printf("%.2f% "),100-$8}') #已使用CPU百分比
swap_total=$(free | awk '/Swap/{print $2}') #总swap容量
swap_free=$(free | awk '/Swap/{print $NF}') #剩余swap容量
disk=$(df | awk '/^\/dev/{print $1,$2,$4}' | column -t) #磁盘信息
load1=$(uptime | sed 's/,//g' | awk '{print $(NF-2)}') #cpu最近1分钟的平均负载
load5=$(uptime | sed 's/,//g' | awk '{print $(NF-1)}') #cpu最近1分钟的平均负载
load15=$(uptime | sed 's/,//g' | awk '{print $(NF)}') #cpu最近1分钟的平均负载
login_users=$(who | wc -l) #登录用户数量
procs=$(ps -aux | wc -l) #进程总数
users=$(sed -n '$=' /etc/passwd) #系统总账户数量
cpu_info=$(LANG=C lscpu | awk -F: '/Model name/{print $2}'| tr -s ' ' | sed 's/^ //') #cpu型号
cpu_core=$(awk '/processor/{core++} END{print core}' /proc/cpuinfo) #cpu核心数量
yum -y -q install sysstat &> /dev/null #安装性能监控软件
echo -e "\e[34提取磁盘性能指标,请稍后...\e[0m"
tps=$(LANG=C sar -d -p 1 6 | awk '/Average/' | tail -n +2 | awk '{print "["$2"]磁盘平均IO数量:"$3}')
read_write=$(LANG=C sar -d -p 1 6 | awk 'Average' | tail -n +2 | awk '{print "["$2"]平均每秒读写扇区量:"$4,$5}')
irq=$(vmstat 1 2 | tail -n +4 | awk '{print $11}') #中断数量
cs=$(vmstat 1 2 | tail -n +4 | awk '{print $12}') #上下文切换数量
top_proc_mem=$(ps --no-headers -eo comm,rss | sort -k2 -n | tail -10) #占用内存最多的10个进程
top_proc_cpu=$(ps --no-headers -eo comm,pcpu | sort -k2 -n | tail -5) #占用cpu最多的5个进程
#获取网卡流量,接收|发送的数据流量,单位为字节(bytes)
net_monitor=$(cat /proc/net/dev | tail -n +3 | awk 'BEGIN{print "网卡名称 入站数据流量(bytes)出站数据流量(bytes)"} {print $1,$2,$10}' | column -t )
#输出数据信息
echo -e "\033[32m--------------本机主要数据参数表--------------\033[0m"
echo -e "本机IP地址列表:\033[32m ${localip} \033[0m"
echo -e "本机主机名称:\033[32m$hostname\033[0m"
echo -e "操作系统版本:\033[32m$release\033[0m,内核版本:\033[32m$kernel\033[0m"
echo -e "CPU型号为:\033[32m$cpu_info\033[0m,CPU内核数量:\033[32m$cpu_core\033[0m"
echo -e "已使用CPU百分比:\033[32m$cpu_used\033[0m"
echo -e "cpu最近1分钟,5分钟,15分钟的平均负载分别为:\033[32m${load1},${load5},${load15}\033[0m"
echo -e "已使用内存百分比:\033[32m${mem_used}\033[0m"
echo -e "本机总内存容量:\033[32m$swap_total\033[0m,剩余容量:\033[32m$swap_free\033[0m"
echo -e "本机总账户数量为:\033[32m$users\033[0m,当前登录系统的账户数量:\033[32m$login_users\033[0m"
echo -e "占用CPU资源最多的10个进程列表:"
echo -e "\033[32m$top_proc_cpu\033[0m"
echo -e "占用内存资源最多的10个进程列表:"
echo -e "\033[32m$top_proc_mem\033[0m"
echo -e "CPU中断数量:\033[32m$irq\033[0m,CPU上下文切换数量:\033[32m$cs\033[0m"
echo -e "每个磁盘分区的总量与剩余容量如下:"
echo -e "\033[32m$disk\033[0m"
echo -e "\033[32m$tps\033[0m"
echo -e "\033[32m$read_write\033[0m"
echo -e "\033[32m$net_monitor\033[0m"
echo -e "\033[32m-------------------The End---------------------\033[0m"