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?
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?
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"
tail file | grep "pattern\|"
or tail file | grep -E "pattern|"
, depending on your mood. ;) (Supposing you already have --color=auto
in your COLOR_OPTIONS
environment variable set)
– DrBeco
Nov 20 '17 at 03:43
tail -n 2 -f /usr/local/var/log/nginx/*.log & tail -n 5 -f /usr/local/var/log/*.log | grep --color=auto "]"
– vintagexav
Jul 20 '23 at 14:18
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.
grep
does not. – syneticon-dj Nov 23 '12 at 22:58