logo
Published on

Bashコマンドで標準出力の文字列を色付けする

Authors

Linuxパソコン・サーバー上のコマンドライン言語、Bashにおいて、標準出力の検索文字列、特定文字列(例えばエラー文字、警告文字など)を色付け(ハイライト)する方法について紹介します。

pipとかインストール系のコマンドの出力でありがちなのが、できなくてエラーが出てるっぽいけど一体全体どこでエラー出てるのがわからないっていう事態。 stderrじゃなくてstdoutなのでそこらへんで色分けが自動でされない場合や、文字列がerrorじゃなくてfailureやらfailedやらlostとかそういう文字列のとき、せめてハイライトしてあれば見つけやすい。

こうする。

ls | tail -3 | GREP_COLOR='01;31' grep --color -P "zen|"
# or
# ls | tail -3 | grep --color -P "zen|"

文字列zenを赤色にハイライトする例。

肝は、zen|の部分。zenだけだとzenが含まれていない列は出力がされなくなるのがgrepの仕様。こうしてやることでそれを防ぐ。 後述するが、zen|$でもいいっぽい。(未検証)明示的にやるならこちらのやり方のほうが分かりやすそうではある。

Color specific words in Linux terminal whenever they appear - Stack Overflow https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_4c5343dd-f4e2-4630-884c-1c320a4e32b9.png

こういう方法もあるっぽい。ただegrepってのが詳しくないので検証はしてません。(察するにregex標準という感じだろうか。)

tail -f myfwlog | GREP_COLOR='01;36' egrep --color=always 'ssh|$' | GREP_COLOR='01;31' egrep -i --color=always 'drop|deny|$'
bash - Grep output with multiple Colors? - Stack Overflow

こちらも参考に。

egrep --color "\b(PASS|FAIL)\b|$"
How do you colorize only some keywords for a bash script? - Unix & Linux Stack Exchange

bashのカラーコードはこちらで分かります。 32は緑、31は赤、etc

bash:tip_colors_and_formatting - FLOZz' MISC

aliasの例。なお、赤だとどっちの出力なのかわかりずらいのでカラーは36 Cyanとしている。

alias colorizeError="GREP_COLOR='01;36' grep --color -P 'deny|failure|failed|error|lost|'"