Alex C
Alex C

Reputation: 171

Colorize running log after marker

Often I need to analyze large logs in console. I use the following command to colorize important keywords:

echo "string1\nerror\nsuccess\nstring2\nfail" | perl -p -e 's/(success)/\e[1;32;10m$&\e[0m/g;' -e 's/(error|fail)/\e[0;31;10m$&\e[0m/g'

It will colorize "success" with green, and error messages with red and keeps others lines unchanged (as they contain some useful info). But in some cases I need to colorize values after some marker, but not marker itself, i.e. in these lines

Marker1: value1
Marker2: value2

need to highlight only value1 and value2 by known markers. I'm looking for a way to modify my current oneliner to add this function

Also I tried the following solution, which I like less

#!/bin/bash

default=$(tput op)
red=$(tput setaf 1 || tput AF 1)
green=$(tput setaf 2 || tput AF 2)

sed -u -r "s/(Marker1: )(.+)$/\1${red}\2${default}/
    s/(Marker2: )(.+)$/\1${green}\2${default}/" "${@}"`

But it has some problem with buffering, so it's ok for some constant file, but log which is continuosly running is not displayed at all

UPDATE: Found a solution with help of some perl guru.

echo -e "string1\nerror\nsuccess\nstring2\nfail\nMaker1: value1\nMaker2: value2" | \
perl -p \
-e 's/(success)/\e[32m$&\e[0m/g;' \
-e 's/(error|fail)/\e[31m$&\e[0m/g;' \
-e 's/(Maker1:) (.*)/$1 \e[36m$2\e[0m/m;' \
-e 's/(Maker2:) (.*)/$1 \e[01;34m$2\e[0m/m;'

Upvotes: 0

Views: 88

Answers (2)

Alex C
Alex C

Reputation: 171

echo -e "string1\nerror\nsuccess\nstring2\nfail\nMaker1: value1\nMaker2: value2" | \
perl -p \
-e 's/(success)/\e[32m$&\e[0m/g;' \
-e 's/(error|fail)/\e[31m$&\e[0m/g;' \
-e 's/(Maker1:) (.*)/$1 \e[36m$2\e[0m/m;' \
-e 's/(Maker2:) (.*)/$1 \e[01;34m$2\e[0m/m;'

Upvotes: 1

NeronLeVelu
NeronLeVelu

Reputation: 10039

#!/bin/bash

default=$(tput op)
red=$(tput setaf 1 || tput AF 1)
green=$(tput setaf 2 || tput AF 2)
#default='e[0m'
#red='e[0;31;10m'
#green='e[1;32;10m'

# automaticaly use passed argument file if any or stdin if not
sed -u -r \
 "/success/    s//${green}&${default}/
  /error|fail/ s//${red}&${default}/
  /^Marker1:/ {s//\1${red}/;s/$/${default}/;}
  /^Marker2:/ {s//\1${green}/;s/$/${default}/;}" \
    $( [ ${#@} -gt 0 ] && echo ${@} )

For a one line:

  • remove other line thans sed one
  • replace newline in sed by ;
  • use directly the terminal code in place of variable
  • remove the last line if you pipe or use specific file instead

Upvotes: 0

Related Questions