diff options
-rwxr-xr-x | color | 98 |
1 files changed, 98 insertions, 0 deletions
@@ -0,0 +1,98 @@ +#!/bin/bash +# +# Simple colorize for bash by means of sed +# +# Copyright 2008+2012 by Andreas Schamanek <andreas@schamanek.net> +# GPL licensed (see end of file) * Use at your own risk! +# +# Usage examples: +# tail -f somemaillog | mycolorize white '^From: .*' bell +# tail -f somemaillog | mycolorize white '^From: \/.*' green 'Folder: .*' +# tail -f somemaillog | mycolorize --unbuffered white '^From: .*' +# +# Notes: +# Regular expressions need to be suitable for _sed --regexp-extended_ +# Slashes / need no escaping (we use ^A as delimiter). +# \/ splits the coloring (similar to procmailrc. Matches behind get color. +# Even "white '(for|to) \/(her|him).*$'" works :) Surprisingly ;) +# To color the string '\/' use the regular expression '\\()/'. +# If the 1st argument is -u or --unbuffered, _sed_ will be run so. + +# For the colors see tput(1) and terminfo(5), or e.g. +# https://wiki.archlinux.org/index.php/Color_Bash_Prompt + +bold=$(tput bold) # make colors bold/bright +#normal=$(tput sgr0) # normal text +normal=$(echo -e "\e[0m") # (works better sometimes) + +red="$bold$(tput setaf 1)" # bright red text +green=$(tput setaf 2) # dim green text +fawn=$(tput setaf 3); beige="$fawn" # dark yellow text +yellow="$bold$fawn" # bright yellow text +darkblue=$(tput setaf 4) # dim blue text +blue="$bold$darkblue" # bright blue text +purple=$(tput setaf 5); magenta="$purple" # magenta text +pink="$bold$purple" # bright magenta text +darkcyan=$(tput setaf 6) # dim cyan text +cyan="$bold$darkcyan" # bright cyan text +gray=$(tput setaf 7) # dim white text +white="$bold$gray" # bright white text + +bell=$(tput bel) # bell/beep + +# Make output unbuffered? (Pass argument -u|--unbuffered to _sed_.) +if [ "/$1/" = '/-u/' -o "/$1/" = '/--unbuffered/' ] ; then + UNBUFFERED='-u'; shift +else + UNBUFFERED="" +fi + +# produce separator character ^A (for _sed_) +A=$(echo | tr '\012' '\001') + +# compile all rules given at command line to 1 set of rules for SED +while [ "/$1/" != '//' ] ; do + c1=''; re=''; beep='' + c1=$1 ; re="$2" ; shift 2 + # if a beep is requested in the optional 3rd parameter set $beep + [ "/$1/" != '//' ] && [[ ( "$1" = 'bell' || "$1" = 'beep' ) ]] \ + && beep=$bell && shift + # if the regular expression includes \/ we split the substitution + if [ "/${re/*\\\/*/}/" = '//' ] ; then + # we need to count "("s before the \/ (=$left) + left="${re%\\/*}"; leftlength=${#left} + # first we count "\(" + dummy=${left//\\(}; escdgroups=$(( (leftlength-${#dummy})/2 )) + # now "(" (and we add 2 for the groups used for ($re) in $sedrules) + dummy=${left//(}; groupcnt=$((leftlength-${#dummy}-escdgroups+2)) + # replace \/ with )( so below we get (left-re)(right-re) + re="${re/\\\//)(}" + sedrules="$sedrules;s$A($re)$A\1${!c1}\\$groupcnt$beep$normal${A}g" + else + sedrules="$sedrules;s$A($re)$A${!c1}\1$beep$normal${A}g" + fi + +done + +# call sed to do the main job +sed $UNBUFFERED --regexp-extended -e "$sedrules" + +exit + +# License +# +# This script is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This script is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this script; if not, write to the +# Free Software Foundation, Inc., 59 Temple Place, Suite 330, +# Boston, MA 02111-1307 USA + |