Pipable command to print in color?
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?
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)
colorize(){
GREEN="\033[0;32m"
CYAN="\033[0;36m"
GRAY="\033[0;37m"
BLUE="\033[0;34m"
YELLOW="\033[0;33m"
NORMAL="\033[m"
color=\$${1:-NORMAL}
# activate color passed as argument
echo -ne "`eval echo ${color}`"
# read stdin (pipe) and print from it:
cat
# 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.
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;; esac 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;; esac printf "$2"; tput sgr0 }
Then just call it like this colorprintf green "This text is in green!"
Note, echo
provides a trailing new line while printf
does not.
I use this old script, names hilite.pl, 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>) {
s/($target)/$color$1$end/;
print $_;
}
Then i can use it in pipes, to "hilite" log output or other things, using regexp/PCRE:
echo 'hello color world!!' | hilite.pl 34 "[Hh]el[^ ]*" | hilite.pl 43 .orld | hilite.pl 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 | hilite.pl $i $i ; done