如何在Linux中改变echo的输出颜色
我正在尝试使用echo命令在terminal中打印文本。
我想用红色打印文本。 我该怎么做?
您可以使用这些ANSI转义码 :
Black 0;30 Dark Gray 1;30 Red 0;31 Light Red 1;31 Green 0;32 Light Green 1;32 Brown/Orange 0;33 Yellow 1;33 Blue 0;34 Light Blue 1;34 Purple 0;35 Light Purple 1;35 Cyan 0;36 Light Cyan 1;36 Light Gray 0;37 White 1;37
然后在脚本中使用它们:
# .---------- constant part! # vvvv vvvv-- the code from above RED='\033[0;31m' NC='\033[0m' # No Color printf "I ${RED}love${NC} Stack Overflow\n"
用红色打印love
。
从@ james-lim的评论,如果你使用echo
命令,一定要使用-e标志来允许反斜杠转义。
# Continued from above example echo -e "I ${RED}love${NC} Stack Overflow"
(除非要添加额外的空行,否则在使用echo时不要添加"\n"
)
您可以使用awesome tput
命令(在Ignacio的答案中build议)为各种事情生成terminal控制代码。
用法
具体的tput
子命令将在后面讨论。
直接
调用tput
作为一系列命令的一部分:
tput setaf 1; echo "this is red text"
使用;
而不是&&
所以如果input错误的文字仍然显示。
壳variables
另一个select是使用shellvariables:
red=`tput setaf 1` green=`tput setaf 2` reset=`tput sgr0` echo "${red}red text ${green}green text${reset}"
tput
产生被terminal解释为具有特殊含义的字符序列。 他们不会被显示自己。 请注意,它们仍然可以保存到文件中或作为terminal以外的其他程序的input进行处理。
命令replace
使用命令replace将tput
的输出直接插入echo
string可能会更方便:
echo "$(tput setaf 1)Red text $(tput setab 7)and white background$(tput sgr 0)"
例
上面的命令在Ubuntu上产生这个命令:
前景和背景颜色命令
tput setab [1-7] # Set the background colour using ANSI escape tput setaf [1-7] # Set the foreground colour using ANSI escape
颜色如下:
Num Colour #define RGB 0 black COLOR_BLACK 0,0,0 1 red COLOR_RED 1,0,0 2 green COLOR_GREEN 0,1,0 3 yellow COLOR_YELLOW 1,1,0 4 blue COLOR_BLUE 0,0,1 5 magenta COLOR_MAGENTA 1,0,1 6 cyan COLOR_CYAN 0,1,1 7 white COLOR_WHITE 1,1,1
还有非ANSI版本的颜色设置函数( setb
代替setab
, setf
代替setaf
),它们使用不同的数字,这里没有给出。
文本模式命令
tput bold # Select bold mode tput dim # Select dim (half-bright) mode tput smul # Enable underline mode tput rmul # Disable underline mode tput rev # Turn on reverse video mode tput smso # Enter standout (bold) mode tput rmso # Exit standout mode
光标移动命令
tput cup YX # Move cursor to screen postion X,Y (top left is 0,0) tput cuf N # Move N characters forward (right) tput cub N # Move N characters back (left) tput cuu N # Move N lines up tput ll # Move to last line, first column (if no cup) tput sc # Save the cursor position tput rc # Restore the cursor position tput lines # Output the number of lines of the terminal tput cols # Output the number of columns of the terminal
清除并插入命令
tput ech N # Erase N characters tput clear # Clear screen and move the cursor to 0,0 tput el 1 # Clear to beginning of line tput el # Clear to end of line tput ed # Clear to end of screen tput ich N # Insert N characters (moves rest of line forward!) tput il N # Insert N lines
其他命令
tput sgr0 # Reset text format to the terminal's default tput bel # Play a bell
随着compiz摇摇欲坠的窗口 , bel
命令使terminal摆动一秒钟,吸引用户的注意力。
脚本
tput
接受每行包含一个命令的脚本,这些脚本在tput
退出之前按顺序执行。
通过回显多行string并pipe道来避免临时文件:
echo -e "setf 7\nsetb 1" | tput -S # set fg white and bg red
也可以看看
- 看到
man 1 tput
- 有关命令的完整列表以及有关这些选项的更多详细信息,请参阅
man 5 terminfo
。 (相应的tput
命令列在巨大表的Cap-name
列中,该行从第81行开始。)
# Reset Color_Off='\033[0m' # Text Reset # Regular Colors Black='\033[0;30m' # Black Red='\033[0;31m' # Red Green='\033[0;32m' # Green Yellow='\033[0;33m' # Yellow Blue='\033[0;34m' # Blue Purple='\033[0;35m' # Purple Cyan='\033[0;36m' # Cyan White='\033[0;37m' # White # Bold BBlack='\033[1;30m' # Black BRed='\033[1;31m' # Red BGreen='\033[1;32m' # Green BYellow='\033[1;33m' # Yellow BBlue='\033[1;34m' # Blue BPurple='\033[1;35m' # Purple BCyan='\033[1;36m' # Cyan BWhite='\033[1;37m' # White # Underline UBlack='\033[4;30m' # Black URed='\033[4;31m' # Red UGreen='\033[4;32m' # Green UYellow='\033[4;33m' # Yellow UBlue='\033[4;34m' # Blue UPurple='\033[4;35m' # Purple UCyan='\033[4;36m' # Cyan UWhite='\033[4;37m' # White # Background On_Black='\033[40m' # Black On_Red='\033[41m' # Red On_Green='\033[42m' # Green On_Yellow='\033[43m' # Yellow On_Blue='\033[44m' # Blue On_Purple='\033[45m' # Purple On_Cyan='\033[46m' # Cyan On_White='\033[47m' # White # High Intensity IBlack='\033[0;90m' # Black IRed='\033[0;91m' # Red IGreen='\033[0;92m' # Green IYellow='\033[0;93m' # Yellow IBlue='\033[0;94m' # Blue IPurple='\033[0;95m' # Purple ICyan='\033[0;96m' # Cyan IWhite='\033[0;97m' # White # Bold High Intensity BIBlack='\033[1;90m' # Black BIRed='\033[1;91m' # Red BIGreen='\033[1;92m' # Green BIYellow='\033[1;93m' # Yellow BIBlue='\033[1;94m' # Blue BIPurple='\033[1;95m' # Purple BICyan='\033[1;96m' # Cyan BIWhite='\033[1;97m' # White # High Intensity backgrounds On_IBlack='\033[0;100m' # Black On_IRed='\033[0;101m' # Red On_IGreen='\033[0;102m' # Green On_IYellow='\033[0;103m' # Yellow On_IBlue='\033[0;104m' # Blue On_IPurple='\033[0;105m' # Purple On_ICyan='\033[0;106m' # Cyan On_IWhite='\033[0;107m' # White
另外,您可以使用三种方法:启动和重置
\e[0;32m or \x1b[0;32m or \033[0;32m #start \e[m or \x1b[m or \033[m #reset
注意重置心情[m或[0m或[0
贝壳:
\e
ASCIIhex:
\x1B \x1b # but can not write \X1b
ASCII oct:
\033
example_1与\ e:
printf "\e[31;4m Hello \e[0m\n"
example_2与\ x1b:
printf "\x1b[31;4m Hello \x1b[0m\n"
带有\ 033的example_3:
printf "\033[31;4m Hello \033[0m\n"
按结构显示颜色:
for code in {0..255}; do echo -e "\e[38;05;${code}m $code: Test"; done
和
i=30; while true;do echo -e "$i = \e[0;$[i++]mStackOverFlow\e[m";if [ $i == 49 ];then break;fi; sleep 1;done
和
#!/bin/bash for (( i = 30; i <= 37; i++ )); do echo -e "\e[0;"$i"m Hi stackoverflow"; done
和更多样本:
samples_1个 samples_2
和更多信息:
间信息
如果你想自定义bash提示符( .bashrc ),要小心,例如,如果你使用
\e[0;31m anything \e[0
东西都是好的,但是每当你使用长命令,命令在你的terminal丢失,或者kosole。 所以对于这一点,你可以使用\[\033[5;36m\] your_text \033[00m\]
例如我的.bashrc:
export PS1='\[\033[5;36m\] \W \[\033[0;31m\] 〉\033[00m\]'
最重要的是
00m
在行末
如果你想在你的bash上使用闪烁代码,你可以使用5个数字来做到这一点
echo -e "Normal \e[5mBlink"
我的konsole,它不能在gnome-terminal上工作
我很抱歉,如果你发现任何错误,我的英文写作不是很好
更新
你可能会感兴趣的看到我的 插图_Perl_one-liner
UPDATE2
以一种方便的方式,您可以使用这个简单的C
代码来查看每个颜色代码的输出:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include "ansi_color_code.h" int main( const int argc, const char** const argv ){ time_t rt; srand( ( unsigned ) time( &rt ) ); if( argc < 2 ){ printf( "Usage: [color-name] [some-text] [endl|]\n" ); return 0; } const char* reset_color = "\033[m"; const char** argv_iter = argv; const char* user_color = argv[ 1 ]; int index_match = -1; for( int index = 0; index < 7 * 8; ++index ){ if( !strcmp( user_color, color_name[ index ] ) ){ index_match = index; } ++argv_iter; } argv_iter = argv; argv_iter += 2; if( index_match != -1 ){ if( !strcmp( argv[ argc - 1 ], "endl" ) ){ for( int index = 2; index < argc - 1; ++index ){ printf( "%s%s%s\n",ANCI_color[ ( !strcmp( user_color, "random" ) ? rand() % 56 : index_match ) ], *argv_iter, reset_color ); ++argv_iter; } } else { for( int index = 1; index < argc - 1; ++index ){ printf( "%s%s %s",ANCI_color[ ( !strcmp( user_color, "random" ) ? rand() % 56 : index_match ) ], *argv_iter, reset_color ); ++argv_iter; } printf( "\n" ); } } else { printf( "Usage: [color-name] [some-text] [endl|]\n" ); } return 0;}
这里是完整的代码和更多的细节在我的github上
使用具有setaf
能力的tput
和1的参数。
echo "$(tput setaf 1)Hello, world$(tput sgr0)"
echo -e "\033[31m Hello World"
[31m
控制文字颜色:
-
30
–37
集前景色 -
40
–47
集背景颜色
颜色代码的更完整列表可以在这里find 。
将文本颜色重新设置回string末尾的\033[0m
是一种很好的做法。
这是颜色开关 \033[
。 见历史 。
颜色代码如1;32
(浅绿色), 0;34
(蓝色), 1;34
(浅蓝色)等
我们使用颜色开关\033[
和0m
,无色代码来终止颜色序列。 就像使用标记语言打开和closures标签一样。
SWITCH="\033[" NORMAL="${SWITCH}0m" YELLOW="${SWITCH}1;33m" echo "${YELLOW}hello, yellow${NORMAL}"
简单的彩色echo
function
cecho() { local code="\033[" case "$1" in black | bk) color="${code}0;30m";; red | r) color="${code}1;31m";; green | g) color="${code}1;32m";; yellow | y) color="${code}1;33m";; blue | b) color="${code}1;34m";; purple | p) color="${code}1;35m";; cyan | c) color="${code}1;36m";; gray | gr) color="${code}0;37m";; *) local text="$1" esac [ -z "$text" ] && local text="$color$2${code}0m" echo "$text" } cecho "Normal" cecho y "Yellow!"
一个简单的方法来改变颜色只有一个echo
是定义这样的function:
function coloredEcho(){ local exp=$1; local color=$2; if ! [[ $color =~ '^[0-9]$' ]] ; then case $(echo $color | tr '[:upper:]' '[:lower:]') in black) color=0 ;; red) color=1 ;; green) color=2 ;; yellow) color=3 ;; blue) color=4 ;; magenta) color=5 ;; cyan) color=6 ;; white|*) color=7 ;; # white or invalid color esac fi tput setaf $color; echo $exp; tput sgr0; }
用法:
coloredEcho "This text is green" green
或者你可以直接使用德鲁的答案中提到的颜色代码:
coloredEcho "This text is green" 2
使用input来计算颜色代码。 避免使用ANSI转义码(例如\E[31;1m
红色),因为它的便携性较差。 例如,OS X上的Bash不支持它。
BLACK=`tput setaf 0` RED=`tput setaf 1` GREEN=`tput setaf 2` YELLOW=`tput setaf 3` BLUE=`tput setaf 4` MAGENTA=`tput setaf 5` CYAN=`tput setaf 6` WHITE=`tput setaf 7` BOLD=`tput bold` RESET=`tput sgr0` echo -e "hello ${RED}some red text${RESET} world"
这些代码在我的Ubuntu盒子上工作:
echo -e "\x1B[31m foobar \x1B[0m" echo -e "\x1B[32m foobar \x1B[0m" echo -e "\x1B[96m foobar \x1B[0m" echo -e "\x1B[01;96m foobar \x1B[0m" echo -e "\x1B[01;95m foobar \x1B[0m" echo -e "\x1B[01;94m foobar \x1B[0m" echo -e "\x1B[01;93m foobar \x1B[0m" echo -e "\x1B[01;91m foobar \x1B[0m" echo -e "\x1B[01;90m foobar \x1B[0m" echo -e "\x1B[01;89m foobar \x1B[0m" echo -e "\x1B[01;36m foobar \x1B[0m"
这将打印所有不同颜色的字母abcd:
echo -e "\x1B[0;93m a \x1B[0m b \x1B[0;92m c \x1B[0;93m d \x1B[0;94m"
For循环:
for (( i = 0; i < 17; i++ )); do echo "$(tput setaf $i)This is ($i) $(tput sgr0)"; done
为了可读性
如果要提高代码的可读性 ,可以先使用echo
string,然后使用sed
稍后添加颜色:
echo 'Hello World!' | sed $'s/World/\e[1m&\e[0m/'
到目前为止,我最喜欢的答案是colorEcho。
只要发布另一个选项,你可以看看这个小工具xcol
https://ownyourbits.com/2017/01/23/colorize-your-stdout-with-xcol/
你就像grep一样使用它,例如,它会为每个参数使用不同的颜色为stdin着色
sudo netstat -putan | xcol httpd sshd dnsmasq pulseaudio conky tor Telegram firefox "[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+" ":[[:digit:]]+" "tcp." "udp." LISTEN ESTABLISHED TIME_WAIT
请注意,它接受sed将接受的任何正则expression式。
该工具使用以下定义
#normal=$(tput sgr0) # normal text normal=$'\e[0m' # (works better sometimes) bold=$(tput bold) # make colors bold/bright red="$bold$(tput setaf 1)" # bright red text green=$(tput setaf 2) # dim green text fawn=$(tput setaf 3); beige="$fawn" # dark yellow text yellow="$bold$fawn" # bright yellow text darkblue=$(tput setaf 4) # dim blue text blue="$bold$darkblue" # bright blue text purple=$(tput setaf 5); magenta="$purple" # magenta text pink="$bold$purple" # bright magenta text darkcyan=$(tput setaf 6) # dim cyan text cyan="$bold$darkcyan" # bright cyan text gray=$(tput setaf 7) # dim white text darkgray="$bold"$(tput setaf 0) # bold black = dark gray text white="$bold$gray" # bright white text
我在这样的脚本中使用这些variables
echo "${red}hello ${yellow}this is ${green}coloured${normal}"
感谢@ k-five这个答案
declare -A colors #curl www.bunlongheng.com/code/colors.png # Reset colors[Color_Off]='\033[0m' # Text Reset # Regular Colors colors[Black]='\033[0;30m' # Black colors[Red]='\033[0;31m' # Red colors[Green]='\033[0;32m' # Green colors[Yellow]='\033[0;33m' # Yellow colors[Blue]='\033[0;34m' # Blue colors[Purple]='\033[0;35m' # Purple colors[Cyan]='\033[0;36m' # Cyan colors[White]='\033[0;37m' # White # Bold colors[BBlack]='\033[1;30m' # Black colors[BRed]='\033[1;31m' # Red colors[BGreen]='\033[1;32m' # Green colors[BYellow]='\033[1;33m' # Yellow colors[BBlue]='\033[1;34m' # Blue colors[BPurple]='\033[1;35m' # Purple colors[BCyan]='\033[1;36m' # Cyan colors[BWhite]='\033[1;37m' # White # Underline colors[UBlack]='\033[4;30m' # Black colors[URed]='\033[4;31m' # Red colors[UGreen]='\033[4;32m' # Green colors[UYellow]='\033[4;33m' # Yellow colors[UBlue]='\033[4;34m' # Blue colors[UPurple]='\033[4;35m' # Purple colors[UCyan]='\033[4;36m' # Cyan colors[UWhite]='\033[4;37m' # White # Background colors[On_Black]='\033[40m' # Black colors[On_Red]='\033[41m' # Red colors[On_Green]='\033[42m' # Green colors[On_Yellow]='\033[43m' # Yellow colors[On_Blue]='\033[44m' # Blue colors[On_Purple]='\033[45m' # Purple colors[On_Cyan]='\033[46m' # Cyan colors[On_White]='\033[47m' # White # High Intensity colors[IBlack]='\033[0;90m' # Black colors[IRed]='\033[0;91m' # Red colors[IGreen]='\033[0;92m' # Green colors[IYellow]='\033[0;93m' # Yellow colors[IBlue]='\033[0;94m' # Blue colors[IPurple]='\033[0;95m' # Purple colors[ICyan]='\033[0;96m' # Cyan colors[IWhite]='\033[0;97m' # White # Bold High Intensity colors[BIBlack]='\033[1;90m' # Black colors[BIRed]='\033[1;91m' # Red colors[BIGreen]='\033[1;92m' # Green colors[BIYellow]='\033[1;93m' # Yellow colors[BIBlue]='\033[1;94m' # Blue colors[BIPurple]='\033[1;95m' # Purple colors[BICyan]='\033[1;96m' # Cyan colors[BIWhite]='\033[1;97m' # White # High Intensity backgrounds colors[On_IBlack]='\033[0;100m' # Black colors[On_IRed]='\033[0;101m' # Red colors[On_IGreen]='\033[0;102m' # Green colors[On_IYellow]='\033[0;103m' # Yellow colors[On_IBlue]='\033[0;104m' # Blue colors[On_IPurple]='\033[0;105m' # Purple colors[On_ICyan]='\033[0;106m' # Cyan colors[On_IWhite]='\033[0;107m' # White color=${colors[$input_color]} white=${colors[White]} # echo $white for i in "${!colors[@]}" do echo -e "$i = ${colors[$i]}I love you$white" done
结果
希望这个图像帮助你挑选你的bash的颜色:D
为了扩大这个答案 ,对于我们这个懒惰的人来说:
function echocolor() { # $1 = string COLOR='\033[1;33m' NC='\033[0m' printf "${COLOR}$1${NC}\n" } echo "This won't be colored" echocolor "This will be colorful"
这个问题一遍又一遍地回答:-)但是为什么不呢。
在现代环境中,首先使用tput
比通过echo -E
手动注入ASCII代码更方便
这是一个快速的bash函数:
say() { echo "$@" | sed \ -e "s/\(\(@\(red\|green\|yellow\|blue\|magenta\|cyan\|white\|reset\|b\|u\)\)\+\)[[]\{2\}\(.*\)[]]\{2\}/\1\4@reset/g" \ -e "s/@red/$(tput setaf 1)/g" \ -e "s/@green/$(tput setaf 2)/g" \ -e "s/@yellow/$(tput setaf 3)/g" \ -e "s/@blue/$(tput setaf 4)/g" \ -e "s/@magenta/$(tput setaf 5)/g" \ -e "s/@cyan/$(tput setaf 6)/g" \ -e "s/@white/$(tput setaf 7)/g" \ -e "s/@reset/$(tput sgr0)/g" \ -e "s/@b/$(tput bold)/g" \ -e "s/@u/$(tput sgr 0 1)/g" }
现在你可以使用:
say @b@green[[Success]]
要得到:
tput
可移植性注意事项
第一次inputtput(1)
源代码在1986年9月上传
tput(1)
在20世纪90年代的X / Open curses语义中已经可用(1997年标准具有下面提到的语义)。
所以它( 非常 )无处不在。
而这个我曾经看到所有的组合,并决定哪些读取酷:
for (( i = 0; i < 8; i++ )); do for (( j = 0; j < 8; j++ )); do printf "$(tput setab $i)$(tput setaf $j)(b=$i, f=$j)$(tput sgr0)\n" done done
我写了赃物来实现这一点。
你可以做
pip install swag
现在,您可以通过以下方式将所有的转义命令作为txt文件安装到给定的目标:
swag install -d <colorsdir>
甚至更容易通过:
swag install
哪个会将颜色安装到~/.colors
。
你可以像这样使用它们:
echo $(cat ~/.colors/blue.txt) This will be blue
或者这样,我觉得其实更有趣:
swag print -c red -t underline "I will turn red and be underlined"
检查一下asciinema !
就像在外面的东西一样,通过grep传递它会突出显示为红色(但只是红色)。 您也可以使用命名pipe道,以便您的string更接近行尾:
grep '.*' --color=always <(echo "foobar")
这是一个简单的小脚本,我最近放在一起,将着色任何pipe道input,而不是使用“厕所”。
File: color.bsh
#!/usr/bin/env bash ## AMDanischewski 2015+(c) Free - for (all (uses and ## modifications)) - except you must keep this notice intact. declare INPUT_TXT="" declare ADD_LF="\n" declare -i DONE=0 declare -r COLOR_NUMBER="${1:-247}" declare -r ASCII_FG="\\033[38;05;" declare -r COLOR_OUT="${ASCII_FG}${COLOR_NUMBER}m" function show_colors() { ## perhaps will add bg 48 to first loop eventually for fgbg in 38; do for color in {0..256} ; do echo -en "\\033[${fgbg};5;${color}m ${color}\t\\033[0m"; (($((${color}+1))%10==0)) && echo; done; echo; done } if [[ ! $# -eq 1 || ${1} =~ ^-. ]]; then show_colors echo " Usage: ${0##*/} <color fg>" echo " Eg echo \"Hello world!\" | figlet | ${0##*/} 54" else while IFS= read -r PIPED_INPUT || { DONE=1; ADD_LF=""; }; do PIPED_INPUT=$(sed 's#\\#\\\\#g' <<< "${PIPED_INPUT}") INPUT_TXT="${INPUT_TXT}${PIPED_INPUT}${ADD_LF}" ((${DONE})) && break; done echo -en "${COLOR_OUT}${INPUT_TXT}\\033[00m" fi
然后用红色(196)称呼它:
$> echo "text you want colored red" | color.bsh 196
red='\e[0;31m' NC='\e[0m' # No Color echo -e "${red}Hello Stackoverflow${NC}"
这个答案是正确的,除了颜色的调用不应该在引号内。
echo -e ${red}"Hello Stackoverflow"${NC}
应该做的伎俩。