How to change the output color of echo in Linux How to change the output color of echo in Linux bash bash

How to change the output color of echo in Linux


You can use these ANSI escape codes:

Black        0;30     Dark Gray     1;30Red          0;31     Light Red     1;31Green        0;32     Light Green   1;32Brown/Orange 0;33     Yellow        1;33Blue         0;34     Light Blue    1;34Purple       0;35     Light Purple  1;35Cyan         0;36     Light Cyan    1;36Light Gray   0;37     White         1;37

And then use them like this in your script:

#    .---------- constant part!#    vvvv vvvv-- the code from aboveRED='\033[0;31m'NC='\033[0m' # No Colorprintf "I ${RED}love${NC} Stack Overflow\n"

which prints love in red.

From @james-lim's comment, if you are using the echo command, be sure to use the -e flag to allow backslash escapes.

# Continued from above exampleecho -e "I ${RED}love${NC} Stack Overflow"

(don't add "\n" when using echo unless you want to add an additional empty line)


You can use the awesome tput command (suggested in Ignacio's answer) to produce terminal control codes for all kinds of things.


Usage

Specific tput sub-commands are discussed later.

Direct

Call tput as part of a sequence of commands:

tput setaf 1; echo "this is red text"

Use ; instead of && so if tput errors the text still shows.

Shell variables

Another option is to use shell variables:

red=`tput setaf 1`green=`tput setaf 2`reset=`tput sgr0`echo "${red}red text ${green}green text${reset}"

tput produces character sequences that are interpreted by the terminal as having a special meaning. They will not be shown themselves. Note that they can still be saved into files or processed as input by programs other than the terminal.

Command substitution

It may be more convenient to insert tput's output directly into your echo strings using command substitution:

echo "$(tput setaf 1)Red text $(tput setab 7)and white background$(tput sgr 0)"

Example

The above command produces this on Ubuntu:

Screenshot of colour terminal text


Foreground & background colour commands

tput setab [1-7] # Set the background colour using ANSI escapetput setaf [1-7] # Set the foreground colour using ANSI escape

Colours are as follows:

Num  Colour    #define         R G B0    black     COLOR_BLACK     0,0,01    red       COLOR_RED       1,0,02    green     COLOR_GREEN     0,1,03    yellow    COLOR_YELLOW    1,1,04    blue      COLOR_BLUE      0,0,15    magenta   COLOR_MAGENTA   1,0,16    cyan      COLOR_CYAN      0,1,17    white     COLOR_WHITE     1,1,1

There are also non-ANSI versions of the colour setting functions (setb instead of setab, and setf instead of setaf) which use different numbers, not given here.

Text mode commands

tput bold    # Select bold modetput dim     # Select dim (half-bright) modetput smul    # Enable underline modetput rmul    # Disable underline modetput rev     # Turn on reverse video modetput smso    # Enter standout (bold) modetput rmso    # Exit standout mode

Cursor movement commands

tput cup Y X # 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 uptput ll      # Move to last line, first column (if no cup)tput sc      # Save the cursor positiontput rc      # Restore the cursor positiontput lines   # Output the number of lines of the terminaltput cols    # Output the number of columns of the terminal

Clear and insert commands

tput ech N   # Erase N characterstput clear   # Clear screen and move the cursor to 0,0tput el 1    # Clear to beginning of linetput el      # Clear to end of linetput ed      # Clear to end of screentput ich N   # Insert N characters (moves rest of line forward!)tput il N    # Insert N lines

Other commands

tput sgr0    # Reset text format to the terminal's defaulttput bel     # Play a bell

With compiz wobbly windows, the bel command makes the terminal wobble for a second to draw the user's attention.


Scripts

tput accepts scripts containing one command per line, which are executed in order before tput exits.

Avoid temporary files by echoing a multiline string and piping it:

echo -e "setf 7\nsetb 1" | tput -S  # set fg white and bg red

See also

  • See man 1 tput
  • See man 5 terminfo for the complete list of commands and more details on these options. (The corresponding tput command is listed in the Cap-name column of the huge table that starts at line 81.)


some variables that you can use:

# ResetColor_Off='\033[0m'       # Text Reset# Regular ColorsBlack='\033[0;30m'        # BlackRed='\033[0;31m'          # RedGreen='\033[0;32m'        # GreenYellow='\033[0;33m'       # YellowBlue='\033[0;34m'         # BluePurple='\033[0;35m'       # PurpleCyan='\033[0;36m'         # CyanWhite='\033[0;37m'        # White# BoldBBlack='\033[1;30m'       # BlackBRed='\033[1;31m'         # RedBGreen='\033[1;32m'       # GreenBYellow='\033[1;33m'      # YellowBBlue='\033[1;34m'        # BlueBPurple='\033[1;35m'      # PurpleBCyan='\033[1;36m'        # CyanBWhite='\033[1;37m'       # White# UnderlineUBlack='\033[4;30m'       # BlackURed='\033[4;31m'         # RedUGreen='\033[4;32m'       # GreenUYellow='\033[4;33m'      # YellowUBlue='\033[4;34m'        # BlueUPurple='\033[4;35m'      # PurpleUCyan='\033[4;36m'        # CyanUWhite='\033[4;37m'       # White# BackgroundOn_Black='\033[40m'       # BlackOn_Red='\033[41m'         # RedOn_Green='\033[42m'       # GreenOn_Yellow='\033[43m'      # YellowOn_Blue='\033[44m'        # BlueOn_Purple='\033[45m'      # PurpleOn_Cyan='\033[46m'        # CyanOn_White='\033[47m'       # White# High IntensityIBlack='\033[0;90m'       # BlackIRed='\033[0;91m'         # RedIGreen='\033[0;92m'       # GreenIYellow='\033[0;93m'      # YellowIBlue='\033[0;94m'        # BlueIPurple='\033[0;95m'      # PurpleICyan='\033[0;96m'        # CyanIWhite='\033[0;97m'       # White# Bold High IntensityBIBlack='\033[1;90m'      # BlackBIRed='\033[1;91m'        # RedBIGreen='\033[1;92m'      # GreenBIYellow='\033[1;93m'     # YellowBIBlue='\033[1;94m'       # BlueBIPurple='\033[1;95m'     # PurpleBICyan='\033[1;96m'       # CyanBIWhite='\033[1;97m'      # White# High Intensity backgroundsOn_IBlack='\033[0;100m'   # BlackOn_IRed='\033[0;101m'     # RedOn_IGreen='\033[0;102m'   # GreenOn_IYellow='\033[0;103m'  # YellowOn_IBlue='\033[0;104m'    # BlueOn_IPurple='\033[0;105m'  # PurpleOn_ICyan='\033[0;106m'    # CyanOn_IWhite='\033[0;107m'   # White

the escape character in bash, hex and octal respectively:

|       | bash  | hex    | octal   | NOTE                         ||-------+-------+--------+---------+------------------------------|| start | \e    | \x1b   | \033    |                              || start | \E    | \x1B   | -       | x cannot be capital          || end   | \e[0m | \x1m0m | \033[0m |                              || end   | \e[m  | \x1b[m | \033[m  | 0 is appended if you omit it ||       |       |        |         |                              |

short example:

| color       | bash         | hex            | octal          | NOTE                                  ||-------------+--------------+----------------+----------------+---------------------------------------|| start green | \e[32m<text> | \x1b[32m<text> | \033[32m<text> | m is NOT optional                     || reset       | <text>\e[0m  | <text>\1xb[0m  | <text>\033[om  | o is optional (do it as best practice ||             |              |                |                |                                       |

bash exception:

If you are going to use these codes in your special bash variables

  • PS0
  • PS1
  • PS2 (= this is for prompting)
  • PS4

you should add extra escape characters so that can interpret them correctly. Without this adding extra escape characters it works but you will face problems when you use Ctrl + r for search in your history.

exception rule for bash

You should add \[ before any starting ANSI code and add \] after any ending ones.
Example:
in regular usage: \033[32mThis is in green\033[0m
for PS0/1/2/4: \[\033[32m\]This is in green\[\033[m\]

\[ is for start of a sequence of non-printable characters
\] is for end of a sequence of non-printable characters

Tip: for memorize it you can first add \[\] and then put your ANSI code between them:

  • \[start-ANSI-code\]
  • \[end-ANSI-code\]

type of color sequence:

  1. 3/4 bit
  2. 8 bit
  3. 24 bit

Before diving into these colors, you should know about 4 modes with these codes:

1. color-mode

It modifies the style of color NOT text. For example make the color bright or darker.

  • 0 reset
  • 1; lighter than normal
  • 2; darker than normal

This mode is not supported widely. It is fully support on Gnome-Terminal.

2. text-mode

This mode is for modifying the style of text NOT color.

  • 3; italic
  • 4; underline
  • 5; blinking (slow)
  • 6; blinking (fast)
  • 7; reverse
  • 8; hide
  • 9; cross-out

and are almost supported.
For example KDE-Konsole supports 5; but Gnome-Terminal does not and Gnome supports 8; but KDE does not.

3. foreground mode

This mode is for colorizing the foreground.

4. background mode

This mode is for colorizing the background.

The below table shows a summary of 3/4 bit version of ANSI-color

|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|| color-mode | octal    | hex     | bash  | description      | example (= in octal)         | NOTE                                 ||------------+----------+---------+-------+------------------+------------------------------+--------------------------------------||          0 | \033[0m  | \x1b[0m | \e[0m | reset any affect | echo -e "\033[0m"            | 0m equals to m                       ||          1 | \033[1m  |         |       | light (= bright) | echo -e "\033[1m####\033[m"  | -                                    ||          2 | \033[2m  |         |       | dark (= fade)    | echo -e "\033[2m####\033[m"  | -                                    ||------------+----------+---------+-------+------------------+------------------------------+--------------------------------------||  text-mode | ~        |         |       | ~                | ~                            | ~                                    ||------------+----------+---------+-------+------------------+------------------------------+--------------------------------------||          3 | \033[3m  |         |       | italic           | echo -e "\033[3m####\033[m"  |                                      ||          4 | \033[4m  |         |       | underline        | echo -e "\033[4m####\033[m"  |                                      ||          5 | \033[5m  |         |       | blink (slow)     | echo -e "\033[3m####\033[m"  |                                      ||          6 | \033[6m  |         |       | blink (fast)     | ?                            | not wildly support                   ||          7 | \003[7m  |         |       | reverse          | echo -e "\033[7m####\033[m"  | it affects the background/foreground ||          8 | \033[8m  |         |       | hide             | echo -e "\033[8m####\033[m"  | it affects the background/foreground ||          9 | \033[9m  |         |       | cross            | echo -e "\033[9m####\033[m"  |                                      ||------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|| foreground | ~        |         |       | ~                | ~                            | ~                                    ||------------+----------+---------+-------+------------------+------------------------------+--------------------------------------||         30 | \033[30m |         |       | black            | echo -e "\033[30m####\033[m" |                                      ||         31 | \033[31m |         |       | red              | echo -e "\033[31m####\033[m" |                                      ||         32 | \033[32m |         |       | green            | echo -e "\033[32m####\033[m" |                                      ||         33 | \033[33m |         |       | yellow           | echo -e "\033[33m####\033[m" |                                      ||         34 | \033[34m |         |       | blue             | echo -e "\033[34m####\033[m" |                                      ||         35 | \033[35m |         |       | purple           | echo -e "\033[35m####\033[m" | real name: magenta = reddish-purple  ||         36 | \033[36m |         |       | cyan             | echo -e "\033[36m####\033[m" |                                      ||         37 | \033[37m |         |       | white            | echo -e "\033[37m####\033[m" |                                      ||------------+----------+---------+-------+------------------+------------------------------+--------------------------------------||         38 | 8/24     |                    This is for special use of 8-bit or 24-bit                                            ||------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|| background | ~        |         |       | ~                | ~                            | ~                                    ||------------+----------+---------+-------+------------------+------------------------------+--------------------------------------||         40 | \033[40m |         |       | black            | echo -e "\033[40m####\033[m" |                                      ||         41 | \033[41m |         |       | red              | echo -e "\033[41m####\033[m" |                                      ||         42 | \033[42m |         |       | green            | echo -e "\033[42m####\033[m" |                                      ||         43 | \033[43m |         |       | yellow           | echo -e "\033[43m####\033[m" |                                      ||         44 | \033[44m |         |       | blue             | echo -e "\033[44m####\033[m" |                                      ||         45 | \033[45m |         |       | purple           | echo -e "\033[45m####\033[m" | real name: magenta = reddish-purple  ||         46 | \033[46m |         |       | cyan             | echo -e "\033[46m####\033[m" |                                      ||         47 | \033[47m |         |       | white            | echo -e "\033[47m####\033[m" |                                      ||------------+----------+---------+-------+------------------+------------------------------+--------------------------------------||         48 | 8/24     |                    This is for special use of 8-bit or 24-bit                                            |                                                                                       ||------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|

The below table shows a summary of 8 bit version of ANSI-color

|------------+-----------+-----------+---------+------------------+------------------------------------+-------------------------|| foreground | octal     | hex       | bash    | description      | example                            | NOTE                    ||------------+-----------+-----------+---------+------------------+------------------------------------+-------------------------||        0-7 | \033[38;5 | \x1b[38;5 | \e[38;5 | standard. normal | echo -e '\033[38;5;1m####\033[m'   |                         ||       8-15 |           |           |         | standard. light  | echo -e '\033[38;5;9m####\033[m'   |                         ||     16-231 |           |           |         | more resolution  | echo -e '\033[38;5;45m####\033[m'  | has no specific pattern ||    232-255 |           |           |         |                  | echo -e '\033[38;5;242m####\033[m' | from black to white     ||------------+-----------+-----------+---------+------------------+------------------------------------+-------------------------|| foreground | octal     | hex       | bash    | description      | example                            | NOTE                    ||------------+-----------+-----------+---------+------------------+------------------------------------+-------------------------||        0-7 |           |           |         | standard. normal | echo -e '\033[48;5;1m####\033[m'   |                         ||       8-15 |           |           |         | standard. light  | echo -e '\033[48;5;9m####\033[m'   |                         ||     16-231 |           |           |         | more resolution  | echo -e '\033[48;5;45m####\033[m'  |                         ||    232-255 |           |           |         |                  | echo -e '\033[48;5;242m####\033[m' | from black to white     ||------------+-----------+-----------+---------+------------------+------------------------------------+-------------------------|

The 8-bit fast test:
for code in {0..255}; do echo -e "\e[38;05;${code}m $code: Test"; done

The below table shows a summary of 24 bit version of ANSI-color

|------------+-----------+-----------+---------+-------------+------------------------------------------+-----------------|| foreground | octal     | hex       | bash    | description | example                                  | NOTE            ||------------+-----------+-----------+---------+-------------+------------------------------------------+-----------------||      0-255 | \033[38;2 | \x1b[38;2 | \e[38;2 | R = red     | echo -e '\033[38;2;255;0;02m####\033[m'  | R=255, G=0, B=0 ||      0-255 | \033[38;2 | \x1b[38;2 | \e[38;2 | G = green   | echo -e '\033[38;2;;0;255;02m####\033[m' | R=0, G=255, B=0 ||      0-255 | \033[38;2 | \x1b[38;2 | \e[38;2 | B = blue    | echo -e '\033[38;2;0;0;2552m####\033[m'  | R=0, G=0, B=255 ||------------+-----------+-----------+---------+-------------+------------------------------------------+-----------------|| background | octal     | hex       | bash    | description | example                                  | NOTE            ||------------+-----------+-----------+---------+-------------+------------------------------------------+-----------------||      0-255 | \033[48;2 | \x1b[48;2 | \e[48;2 | R = red     | echo -e '\033[48;2;255;0;02m####\033[m'  | R=255, G=0, B=0 ||      0-255 | \033[48;2 | \x1b[48;2 | \e[48;2 | G = green   | echo -e '\033[48;2;;0;255;02m####\033[m' | R=0, G=255, B=0 ||      0-255 | \033[48;2 | \x1b[48;2 | \e[48;2 | B = blue    | echo -e '\033[48;2;0;0;2552m####\033[m'  | R=0, G=0, B=255 ||------------+-----------+-----------+---------+-------------+------------------------------------------+-----------------|

some screen-shots

foreground 8-bit summary in a .gif

foreground.gif

background 8-bit summary in a .gif

background.gif

color summary with their values

enter image description hereenter image description hereenter image description hereenter image description here

blinking on KDE-Terminal

KDE-blinking

a simple `C` code that shows you more

cecho_screenshot

a more advanced tool that I developed to deal with these colors:

bline


color-mode shot

fade-normal-bright

text mode shot

only-text-mode

combining is OK

combine

more shots


Tips and Tricks for Advanced Users and Programmers:

Can we use these codes in a programming language?

Yes, you can. I experienced in , , , ,

Do they slow down the speed of a program?

I think, NO.

Can we use these on Windows?

3/4-bit Yes, if you compile the code with gcc
some screen-shots on Win-7

How to calculate the length of code?

\033[ = 2, other parts 1

Where can we use these codes?

Anywhere that has a tty interpreter
xterm, gnome-terminal, kde-terminal, mysql-client-CLI and so on.
For example if you want to colorize your output with mysql you can use Perl

#!/usr/bin/perl -nprint "\033[1m\033[31m$1\033[36m$2\033[32m$3\033[33m$4\033[m" while /([|+-]+)|([0-9]+)|([a-zA-Z_]+)|([^\w])/g;

store this code in a file name: pcc (= Perl Colorize Character) and then put the file a in valid PATH then use it anywhere you like.

ls | pcc
df | pcc

inside mysql first register it for pager and then try:

[user2:db2] pager pccPAGER set to 'pcc'[user2:db2] select * from table-name;

pcc

It does NOT handle Unicode.

Do these codes only do colorizing?

No, they can do a lot of interesting things. Try:

echo -e '\033[2K'  # clear the screen and do not move the position

or:

echo -e '\033[2J\033[u' # clear the screen and reset the position

There are a lot of beginners that want to clear the screen with system( "clear" ) so you can use this instead of system(3) call

Are they available in Unicode?

Yes. \u001b

Which version of these colors is preferable?

It is easy to use 3/4-bit, but it is much accurate and beautiful to use 24-bit.
If you do not have experience with so here is a quick tutorial:
24 bits means: 00000000 and 00000000 and 00000000. Each 8-bit is for a specific color.
1..8 is for and 9..16 for and 17..24 for
So in #FF0000 means and here it is: 255;0;0
in #00FF00 means which here is: 0;255;0
Does that make sense? what color you want combine it with these three 8-bit values.


reference:
Wikipedia
ANSI escape sequences
tldp.org
tldp.org
misc.flogisoft.com
some blogs/web-pages that I do not remember