A fast, simple terminal tool to highlight specific words in your command output with colors. Perfect for tailing logs, debugging, and making command output more readable.
- Automatic color assignment from a preset palette
- Custom hex colors for specific words
- Optiona discreet sound on match
- Case-insensitive matching by default
- Whole word extension mode
- Fast and efficient - designed for real-time log tailing
- Cross-platform - works on macOS and Linux
ch reads from standard input line by line and:
- Searches for specified words (case-insensitive by default)
- Highlights matches with assigned colors
- Handles overlapping matches (first match wins)
- Outputs to standard output with ANSI color codes
The preset colors use a pastel palette optimized for readability on both light and dark terminals: Red, Green, Orange, Blue, Pink, Purple.
Colors cycle when you have more than 6 words without custom colors.
The tool is optimized for streaming, making it ideal for real-time log monitoring.
ch [options] <word1> <word2> <word3> ...Highlights specified words with colors from a preset palette.
ch <word1>::<HEXCOLOR> <word2>::<COLORNAME> <word3> ...Use custom hex colors (with or without # prefix) or named colors. Words without specified colors use preset colors.
Available named colors: red, green, orange, blue, pink, purple
-s- Case-sensitive matching (default is case-insensitive)-w- Whole word extension - extends match until space or end of line-b- Use background colors instead of foreground colors-a- Play a discreet beep when a match is found
# Only highlights exact case matches
echo "Error ERROR error" | ch -s ErrorThe -w flag extends the match to the entire word (until space or EOL):
# Input: "Notice: backup 13344 - started with name backup_13344.zip"
echo "Notice: backup 13344 - started with name backup_13344.zip" | ch -w back
# Highlights: "backup" and "backup_13344.zip" (entire words)The -b flag uses background colors instead of foreground colors:
# Highlight with background colors
tail -f app.log | ch -b error warning success
# Mix with custom colors
tail -f app.log | ch -b error::red warning::orange info::blueThe -a flag plays a discreet beep when a match is found; the alert is not even if matches are frequent (max one every 5 seconds):
# Play a beep
tail -f app.log | ch -a panic::red# Test repeated match heads with a one-second interval
for i in {1..10}; do echo "line $i"; sleep 1; echo "error occurred"; sleep 1; done | ch -a error# Tail a log file with highlighted keywords
tail -f app.log | ch error warning success
# Highlight with custom colors (hex and named)
tail -f app.log | ch error::red warning::orange info::00FF00
# Monitor system logs
journalctl -f | ch failed::red error::red success::green started::blue
# Watch Docker logs
docker logs -f container_name | ch error warning started stopped
# Monitor Kubernetes pods
kubectl logs -f pod-name | ch error panic fatal warning# Highlight database queries
tail -f query.log | ch SELECT INSERT UPDATE DELETE
# Database monitoring
mysql -e "SHOW PROCESSLIST;" | ch SELECT UPDATE DELETE INSERT# Search and highlight
grep -i "error" app.log | ch error exception failed
# Highlight build output
make 2>&1 | ch error warning success completed
# Git log highlighting
git log --oneline | ch feat fix docs style refactor
# Highlight code patterns
cat script.sh | ch function if else error# Mix preset, named, and hex colors
tail -f app.log | ch error::red warning::FF5500 info debug success::green
# Case-insensitive by default (highlights: error, Error, ERROR, ErRoR, etc.)
tail -f app.log | ch error
# Monitor web server logs with named colors
tail -f access.log | ch GET::blue POST::orange 404::red 500::red 200::green# Clone or download the repository
git clone <repository-url>
cd ch
# Initialize Go module
go mod init ch
# Build
go build -o ch
# (Optional) Install to your PATH
sudo mv ch /usr/local/bin/Some programs detect when their output is being piped and switch from line buffering to full buffering for performance. This means output may not appear in real-time when using ch. If you experience delayed highlighting or no output until the program completes, you need to force line buffering using one of these methods:
# Use script (built-in)
script -q /dev/null your-command | ch your-words
# Or install and use unbuffer
brew install expect
unbuffer your-command | ch your-words# Use stdbuf (usually built-in)
stdbuf -oL your-command | ch your-words
# Or use script
script -qfc "your-command" /dev/null | ch your-words
# Or install and use unbuffer
unbuffer your-command | ch your-wordsch uses buffered I/O and processes input line by line, making it efficient for:
- Large log files
- Real-time streaming with
tail -f - High-throughput pipelines
- Continuous monitoring scenarios
- Go 1.16 or higher (for building)
- Terminal with ANSI color support (most modern terminals)
- macOS or Linux operating system
MIT License - feel free to use and modify as needed.