Friday, January 1, 2010

Shell Colors: colorizing shell scripts

Shell scripts commonly used ANSI escape codes for color output.
Following table shows Numbers representing colors in Escape Sequences.

Black 30 40
Red 31 41
Green 32 42
Yellow 33 43
Blue 34 44
Magenta 35 45
Cyan 36 46
White 37 47

The numbers in the above table work for xterm terminal.Result may vary
for other terminal emulators.

Use the following template for writing colored text.

echo -e "\033[COLORm Sample text"

The "\033[" begins the escape sequence.You can also use "\e[" instead
of "\033[". COLOR specifies a foreground color, according to the table
above.The "m" terminates escape sequence, and text begins immediately
after that.

Note: With an echo, the -e option enables the escape sequences.You can
also use printf instead of echo.

printf "\e[COLORm sample text\n"

To print Green text

echo -e "\033[32m Hello World"
printf "\e[32m Hello World"

The problem with above statement is that the blue color that starts
with the 32 color code is never switched back to the regular color, so
any text you type after the prompt and even prompt also is still in the
Green color.

To return to the plain, normal mode, we have yet another sequence.

echo -e "\033[0m"

Now you won't see anything new on the screen, as this echo statement
was not passed any string to display. But it has done its job, which
was to restore the normal viewing mode. Whatever yor type now will be
avoid of any fancy effects.

Escape sequence also allow you to control the manner in which
characters are displayed on the screen.

The following table summarizes numbers representing text attributes
in Escape Sequences.

0Normal Characters
1Bold Characters
4Underlined Characters
5Blinking Characters
7Reverse video Characters

Note: Blink attribute doesn't work in any terminal emulator, but it
will work on the console.

Combining all these Escape Sequences, you can get more fancy effect.
Use the following template for writing colored text on a colored

echo -e "\033[COLOR1;COLOR2m sample text\033[0m"

The semicolon separated numbers "COLOR1" and "COLOR2" specify a
foreground and a background color.The order of the numbers does not
matter, since the foreground and background numbers fall in non-
overlapping ranges."m" terminates the escape sequence, and the text
begins immediately after that.Although setting the colors separately
also work (i.e. \033[44m\033[32m).

There are some differences between colors when combining colors with
bold text attribute.

The following table summarises these differences.

Bold offcolorBold oncolor
0;30Balck1;30Dark Gray
0;31Red1;31Dark Red
0;32Green1;32Dark Green
0;34Blue1;34Dark Blue
0;35Magenta1;35Dark Magenta
0;36Cyan1;30Dark Cyan
0;37Light Gray1;30White

The following shell script prints all the colors and codes on the

# This script echoes colors and codes

echo -e "\n\033[4;31mLight Colors\033[0m \t\t\033[1;4;31mDark Colors\033[0m"

echo -e "\e[0;30;47m Black \e[0m 0;30m \t\e[1;30;40m Dark Gray \e[0m 1;30m"
echo -e "\e[0;31;47m Red \e[0m 0;31m \t\e[1;31;40m Dark Red \e[0m 1;31m"
echo -e "\e[0;32;47m Green \e[0m 0;32m \t\e[1;32;40m Dark Green \e[0m 1;32m"
echo -e "\e[0;33;47m Brown \e[0m 0;33m \t\e[1;33;40m Yellow \e[0m 1;33m"
echo -e "\e[0;34;47m Blue \e[0m 0;34m \t\e[1;34;40m Dark Blue \e[0m 1;34m"
echo -e "\e[0;35;47m Magenta \e[0m 0;35m \t\e[1;35;40m DarkMagenta\e[0m 1;35m"
echo -e "\e[0;36;47m Cyan \e[0m 0;36m \t\e[1;36;40m Dark Cyan \e[0m 1;36m"
echo -e "\e[0;37;47m LightGray\e[0m 0;37m \t\e[1;37;40m White \e[0m 1;37m"


Some examples:

Block background and white text

echo -e "\033[40;37m Hello World\033[0m"

Reverse video text attribute option interchanges fg and bg colors.
Bellow statement prints block on white

echo -e "\033[40;37;7m Hello World\033[0m"

echo -e "\033[33;44m Yellow text on blue background\033[0m"
echo -e "\033[1;33;44m Bold yellow text on blue background\033[0m"
echo -e "\033[1;4;33;44mBold yellow underlined text on blue background\033[0m"

The "tput" command:

Other than echo there is a command called tput using which we
can control the way the output is displayed on the screen.But it is
less flexible than ANSI escape sequences.


  1. Hi. This was excellent info indeed, thanks so much for your help!

    I would like to pipe all my output to a file and retain the color settings using >>

    Any ideas how to do that please?

  2. hi this is a nice post, was actually going to put up a post on it my self, but as you have such a well written post on it, will be providing a link to your post in my post. Hope that is fine.

  3. Awesome Thanks for sharing really helpful

  4. Amazing blog dude, Its in my opinion best blog for bash script related things, I really love your examples and scripts and more importantly your explanation, I have now added you as google friend and will look forward for more quality articles and tips.

    10 examples of using VI Editor in UNIX

  5. It's very nice explained making very easy to understand this topic for bash.
    Thank you!

  6. thanks a lot was use-full for me

  7. I am writing my scripts now colorfully.
    Thank you very much.

  8. Thank u very much . . .

  9. Excellent pieces. Keep posting such kind of information on your blog. I really impressed by your blog.
    Vee Eee Technologies

  10. Hi i am S.Abdul Kareem
    Really This is web site very nice ....
    Thank you..... Very Much Up-loaders

  11. Really Helpful. Thanks

  12. This is very helpul. But when i am trying to send a coloured text file via mail then output comes withour colours.

    Can you plz help.

  13. Thank you! This should really be the number one result when searching for: Color bash output. But, as the eighth result... you were the only helpful one!

    Note: I didn't clearly get the underline from above. I found that you can do your two colors and then the attribute you want. [color1;color2;attributem
    (the 'm' still escapes)

  14. This is great, very helpful.

    I was able to use this to highlight different fields in a log file using AWK:

    tail -f LOGFILE | while read LINE; do echo "$LINE" | awk -F'\t' '{ printf "%-20s %40s %20s %s %s %s %s %s\n", "\33[0;32;40m" $1 "\33[0m",$7,"\33[37m"$13"\33[36m",$14,$19,$21,$22,"\33[35m"$24 }'
    ; done

    (I had to do the read/echo bit because tail-f wouldn't work otherwise. Is there a better way around that?)

  15. This is absolutely beneficial, thank you so much

  16. Nice post. Thanx a ton. Keep posting stuff like this..

  17. I love Balck, it's my favorite color.

  18. Thank You.. Dharmin

  19. thank you .... really helpful

  20. Thanks man!

    A very helpful article.

    I had a lot of fun playing with those colors.

  21. Gracias!.. very useful.


  22. Very easy, thanks :D

  23. Hi All ..need help ...

    while running this command on console :

    echo -e "\e[;32m Hello World\e[0m"

    getting output in green color , but when I am trying to save this in file , output in the file is like this

    ^[[;32m Hello World^[[0m

    Can anyone please help out?