Take the 2-minute tour ×
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems.. It's 100% free, no registration required.

How would I go about colorizing the output of tail with sed?

echo "`tput setaf 1`foo`tput op`" works as expected

echo "foo" | sed -e 's/(foo)/`tput setaf 1`\0`tput op`/g' however, does not.

What am I missing here?

share|improve this question

migrated from serverfault.com Dec 4 '12 at 3:06

This question came from our site for system and network administrators.

    
The reason it's not working is that backticks have no special meaning inside single quotes but they do have a special meaning inside double quotes. –  Ladadadada Nov 23 '12 at 19:57
1  
Take a look at unix.stackexchange.com/questions/8414/… - it has some suggestions for colorizing output including rainbow, multitail and grc which should suit your needs if grep does not. –  syneticon-dj Nov 23 '12 at 22:58

2 Answers 2

The backticks `` in the echo command spawn a process and it's output is substituted into the echo command line. You can see this with e.g.

echo "`tput setaf 1`" | hexdump -C
00000000  1b 5b 33 31 6d 0a                       |.[31m.|

This works because the contents of the "..." are expanded before being passed to echo.

The sed command you're using wraps everything in ' so it is passed to sed without expansion and sed sees it all as literal text.

You can fix this by putting "" around your sed command

echo "foo" | sed -e "s/\(foo\)/`tput setaf 1`\1`tput op`/g"

You also had an error in your sed command. The ( and ) need to be escaped \( and \) to denote the remembered pattern. I've also never use \0 I've always used \1 as the first remembered pattern.

share|improve this answer

Does it have to be sed?

echo "foo bar baz" | grep --color=auto "bar"

The above will highlight bar in red by default. The man page says you can choose what colour to use with the environment variable GREP_COLORS.

To make it print all lines and only highlight bar:

echo "foo bar baz" | grep -E --color=auto "^|bar"
share|improve this answer
1  
+1 use the right tool for the job - there is no need to rape sed just to colorize output. –  syneticon-dj Nov 23 '12 at 20:41
    
@syneticon-dj: This doesn't actually work to colour the output of tail though. It will only print lines containing "bar" (with bar highlighted) and all other lines will be left unprinted. –  Iain Nov 23 '12 at 20:45
    
@Iain adding -C <great number> should help as a quick hack –  syneticon-dj Nov 23 '12 at 22:52

Your Answer

 
discard

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.