Ask Ubuntu is a question and answer site for Ubuntu users and developers. It's 100% free.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I'm a bit new to bash scripting, and I'm wondering if there is a program or built-in command to pipe to that will print in a specified color? Or is there an echo argument to do so?

Like I could do:

echo Hi | commandhere -arguement blue

and it would print "Hi" in the color blue?

share|improve this question
I which grc worked this way rather than as a prefix command. – Sridhar-Sarnobat Feb 29 at 23:46
up vote 7 down vote accepted

I don't know of any utility for colored printing itself, but you can do it easily with a shell function like this:

# colorize stdin according to parameter passed (GREEN, CYAN, BLUE, YELLOW)
    # activate color passed as argument
    echo -ne "`eval echo ${color}`"
    # read stdin (pipe) and print from it:
    # Note: if instead of reading from the pipe, you wanted to print
    # the additional parameters of the function, you could do:
    # shift; echo $*
    # back to normal (no color)
    echo -ne "${NORMAL}"
echo hi | colorize GREEN

If you want to check other colors, take a look at this list. You can add support for any color from there, simply creating an additional variable at this function with the correct name and value.

share|improve this answer
So I just put this into the file "colorize", mark it as executable and put it into /etc/bin ? – TenorB May 10 '12 at 23:15
You can just copy the function to your .bashrc. – elias May 10 '12 at 23:17
Ok thanks! this helps! – TenorB May 10 '12 at 23:19
If you really want to do an executable file though, you should copy everything from within the function (inside the brackets) and put in a file "colorize", mark it as executable and put it in some directory in your $PATH variable (/usr/local/bin is a good place) – elias May 10 '12 at 23:19
If you are like me and just trying to learn more about bash scripting, here's another script that does a very similar thing. Interesting to compare these two scripts. I am making my own to combine them. – hangtwenty Nov 4 '12 at 23:12

I use this old script, names, taken from the web, already with the "unknown author" line!

#!/usr/bin/perl -w
### Usage: hilite <ansi command> <target string>
### Purpose: Will read text from standard input and perform specified highlighting
### command before displaying text to standard output.
### License: GNU GPL
# unknown author 

$|=1; # don't buffer i/o
$command = "$ARGV[0]";
$target = "$ARGV[1]";
$color = "\e[" . $command . "m";
$end = "\e[0m";

while(<STDIN>) {
    print $_;

Then i can use it in pipes, to "hilite" log output or other things, using regexp/PCRE:

 echo 'hello color world!!' | 34 "[Hh]el[^ ]*" | 43 .orld | 32 "\scolor\s"

This will paint hello in blue, color in green and world in yellow background

You can see the color list with (you can expand the bash expression to {01..255} if you want):

for i in {01..10}  {30..49} {90..110}  ; do echo $i | $i $i ; done
share|improve this answer

I created this function that I use in bash scripts.

# Function to echo in specified color
echoincolor () {
    case $1 in
        "red") tput setaf 1;;
        "green") tput setaf 2;;
        "orange") tput setaf 3;;
        "blue") tput setaf 4;;
        "purple") tput setaf 5;;
        "cyan") tput setaf 6;;
        "gray" | "grey") tput setaf 7;;
        "white") tput setaf 8;;
    echo "$2";
    tput sgr0

Then I just call it like this echoincolor green "This text is in green!"

Alternatively, use printf

# Function to print in specified color
colorprintf () {
    case $1 in
        "red") tput setaf 1;;
        "green") tput setaf 2;;
        "orange") tput setaf 3;;
        "blue") tput setaf 4;;
        "purple") tput setaf 5;;
        "cyan") tput setaf 6;;
        "gray" | "grey") tput setaf 7;;
        "white") tput setaf 8;;
    printf "$2";
    tput sgr0

Then just call it like this colorprintf green "This text is in green!"

Remember, echo provides a trailing new line while printf does not.

share|improve this answer

There is a much more elegant answer than any of these:

sudo apt-get install grc

(which also installs grcat)

Now execute:

echo "[SEVERE] Service is down" | grcat ~/conf.username

Where conf.myusername contains:


(for some reason I can't find the right regexp for "everything between quotes")

share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.