Take the 2-minute tour ×
Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

Is there a tool that will let me pipe the output of an executable through it and play a sound or, better yet, highlight the line where a selected phrase occurs?

I want to be able to do something like this:

./myProgWithLotsOfOutput  | ./myMysteryTool blahUsefulWord

and have all of the output appear and scroll by, but any time "blahUsefulWord" appears, the console beeps and highlights that line.

It's kind of a mix of tee and grep. Alternatively, do you have the BASH skills to whip something like this up?

share|improve this question

4 Answers 4

For Bash >= version 3.2:

regex='some regex pattern'
highlight=$(tput setaf 2) # green, use setab to do inverse instead of foreground
off=$(tput sgr0)
while read line
do
    [[ $line =~ $regex ]] && echo -n $'\07'"$highlight"
    echo "$line$off"
done

It highlights the whole line rather than just the match.

share|improve this answer

Based off of this Q&A, I've created the following function:

# mylite since 'highlight' is already a program
function mylite () {
    pattern=$1; shift; file=$1
    grep -E --color "$pattern|$" $file
}

Usage examples:

mylite pattern file.txt
cat file.txt | mylite pattern

No beeping in this example, but I'm sure that can be added by modifying grep as shown by other answers on this page.

share|improve this answer

My mistake on the answer. I tried this:

PATTERN="something"
export GREP_COLOR='1;37;41' # set to a sequence of xterm escape sequences for colorization.
export GREP_OPTIONS=--color=always

while read LINE
do
    echo $LINE | grep $PATTERN || echo $LINE
done
share|improve this answer
    
But grep will only show the lines that match, right? I want to see all of the output with the matching lines highlighted. –  scompt.com Aug 13 '10 at 15:47
    
To ring the bell on each match: echo $LINE | grep $PATTERN && echo -n $'\07' || echo $LINE. However spawning grep for each line could be expensive. –  Dennis Williamson Aug 13 '10 at 16:48
    
To see all the output with the matching lines highlighted, use grep -C999 $PATTERN. That assumes that there are no more than 2 * 999 lines between matches. If you want the whole line containing the match highlighted, use grep -C999 ".*$PATTERN.*". –  garyjohn Aug 14 '10 at 7:35
    
Rather than spawning a grep for each line, you could use sed to insert a bell on each colored line, like this: grep -C999 --color=always $PATTERN | sed '/^[/s/^/^G/'. The ^[ is a literal Esc and ^G is a literal BEL, or Ctrl-G. Those characters can be entered into the sed command by typing Ctrl-V before each one. –  garyjohn Aug 14 '10 at 7:50

Something like logwatch may be what you are looking for.

share|improve this answer

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.