一部のユニットテストコードを実行しています。単体テストコードはプレーンテキストを出力します。テキストが多いので、ユーザーにとって重要なキーワードを強調したいと思います。
この例では、キーワードは「PASS」と「FAIL」です。
「PASS」を緑色に、「FAIL」を赤色で表示するにはどうすればよいですか?
答え1
supercat
あなたが探していることをやっているようです。
パッキング:スーパー猫 Description-en: ターミナルとHTMLテキストの色付けプログラム Supercatは、一致する規則に従ってテキストに色を割り当てるプログラムです。 式/文字列/文字。 SupercatはHTML出力もサポートしています。 標準ASCIIテキストで。いくつかのテキストの着色プログラムとは異なり はい、Supercatを使用するためにプログラマは必要ありません。 ぬりえルールを開発します。 ホームページ:http://supercat.nosredna.net/
コマンドラインで何を色付けするかを教える方法はないようです。構成ファイルを指定する必要があります。
パターンに一致するテキストを強調表示する "hilite" または "hl" というプログラムがあったことを覚えているようです (たとえば、grep --colour
一致しない行も表示する)。検索しても見つかりません。それのために。
最後に、GNUはgrep
ハイライトモードで使用できます。ただし、1つの色しか使用できません(たとえば、PASSを緑色に、FAILを赤色に設定することはできず、両方とも同じ色で強調表示されます)。
次の方法でデータを転送してください。
grep -E --color "\b(PASS|FAIL)\b|$"
この例ではgrep
拡張-E
正規表現オプションを使用していますが、デフォルトの正規表現-G
、-F
固定文字列、および PCRE も使用できます。-P
すべての一致が強調表示されます。デフォルト値は赤色または GREP_COLOR 環境変数を設定します。
これは、パターンの終わりが行の終わりと一致する(つまり、すべての行が一致するため|$
)すべての行が表示されることです(色は指定されていません)。
これは\b
ワード境界表示であるため、FAILと一致しますが、FAILUREとは一致しません。必須ではないため、単語の一部を一致させるには削除してください。
以下は、昨日作成したsupercat用のサンプルラッパースクリプトです。うまくいきますが、書いている間、supercatに大文字と小文字を区別しない検索オプションがないことがわかりました。 IMO、これはプログラムの有用性をはるかに低下させます。ただし、「-i」オプションを作成する必要がないため、スクリプトは大幅に簡素化されます。 :)
#! /bin/bash
# Requires: tempfile from debian-utils, getopt from util-linux, and supercat
SCRIPTNAME=$(basename $0)
CFGFILE=$(tempfile -p spc)
usage() {
cat <<__EOF__
Highlight regexp patterns found on stdin or files specified on command
line with specified colours.
Usage: $SCRIPTNAME [ --colour "pattern" ...] [FILE]
Options:
-k,--black regexp
-r,--red regexp
-g,--green regexp
-y,--yellow regexp
-b,--blue regexp
-m,--magenta regexp
-c,--cyan regexp
-w,--white regexp
Example:
run-script.sh | $SCRIPTNAME --green PASS --red FAIL
__EOF__
exit 0
}
# Format definition from the spc man page:
#1234567890123456789012345678901234567890123456789012345
#HTML Color Name Col A N T RE / String / Characters
FMT="%-20s %3s %1s %1s %1s (%s)\n"
add_color_to_config() {
COLOR="$1"
PATTERN="$2"
printf "$FMT" "$COLOR" "$COLOR" - 0 r "$PATTERN" >> "$CFGFILE"
}
# uses the "getopt" program from util-linux, which supports long
# options. The "getopts" built-in to bash does not.
TEMP=$(getopt \
-o 'hk:r:g:y:b:m:c:w:' \
-l 'help,black:,red:,green:,yellow:,blue:,magenta:,cyan:,white:' \
-n "$0" -- "$@")
if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi
eval set -- "$TEMP"
while true ; do
case "$1" in
-k|--bla*) add_color_to_config blk "$2" ; shift 2 ;;
-r|--red) add_color_to_config red "$2" ; shift 2 ;;
-g|--gre*) add_color_to_config grn "$2" ; shift 2 ;;
-y|--yel*) add_color_to_config yel "$2" ; shift 2 ;;
-b|--blu*) add_color_to_config blu "$2" ; shift 2 ;;
-m|--mag*) add_color_to_config mag "$2" ; shift 2 ;;
-c|--cya*) add_color_to_config cya "$2" ; shift 2 ;;
-w|--whi*) add_color_to_config whi "$2" ; shift 2 ;;
-h|--hel*) usage ; exit 0 ;;
--) shift ; break ;;
*) echo 'Unknown option!' ; exit 1 ;;
esac
done
spc -R -c "$CFGFILE" "$@"
rm -f "$CFGFILE"
答え2
以下は正規表現パターンの色を指定するための一般的なスクリプトです(いくつかのトリミングが必要な場合があります)。
#! /bin/bash
color_to_num () {
case $1 in
black) echo 0;;
red) echo 1;;
green) echo 2;;
yellow) echo 3;;
blue) echo 4;;
purple) echo 5;;
cyan) echo 6;;
white) echo 7;;
*) echo 0;;
esac
}
# default values for foreground and background colors
bg=
fg=
bold="$(tput bold)"
italics=""
boundary=""
while getopts f:b:sli option; do
case "$option" in
f) fg="$OPTARG";;
b) bg="$OPTARG";;
s) bold="";;
l) boundary=".*";;
i) italics="$(tput sitm)";;
esac
done
shift $(($OPTIND - 1))
pattern="$*"
if [ -n "$fg" ]; then
fg=$(tput setaf $(color_to_num $fg))
fi
if [ -n "$bg" ]; then
bg=$(tput setab $(color_to_num $bg))
fi
if [ -z "$fg$bg" ]; then
fg=$(tput smso)
fi
sed "s/${boundary}${pattern}${boundary}/${bold}${italics}${fg}${bg}&$(tput sgr0)/g"
名前を付けhilite.sh
て、次のように使用します。
$ ./BIN_PROGRAM | hilite.sh -f green PASS | hilite.sh -f red FAIL
$ # Here is an example one liner
$ echo -e "line 1: PASS\nline 2: FAIL" | hilite.sh -f green PASS | hilite.sh -f red FAIL
答え3
代替式にランダムな文字列(tput
出力など)を含めるsed
ことは、文字列が有効な構文であることを確認する必要があり(エスケープして)、sed
このような状況の複雑さを避けるのが最善です。私はそれを代わりに使用しますawk
。たとえば、
{ echo line 1: PASS; echo line 2: FAIL; } |
awk -v "red=$(tput setaf 1)" -v "green=$(tput setaf 2)" \
-v "reset=$(tput sgr0)" '
{ for (i = 1; i <= NF; i++) {
if ($i == "FAIL") printf "%s", red "FAIL" reset;
else if ($i == "PASS") printf "%s", green "PASS" reset;
else printf "%s", $i
if (i == NF) printf "%s", ORS
else printf "%s", OFS
}}'
キーはtput
シーケンスをawk
変数に割り当てることです。ここではoptionsを使用して実行されます-v
。
答え4
BASHスクリプトをインストールする場合は、ack
パッケージhhlighter
に便利な基本色とシンプルなインターフェースがあります。https://github.com/paoloantinori/hhighlighter:
次のようにして、次の行を強調表示できますFAIL
。
h -i 'FAIL.*'
または以下を含みますFAIL
。
h -i '.*FAIL.*'
またはさまざまな共通ログエントリの場合:
h -i '.*FAIL.*' '.*PASS.*' '.*WARN.*'
もちろん、通常のgrepを使用した単一色(赤)の場合:
$ printf 'Pass: good job\nFail: bad job\n' | grep -Ei --colour=auto '^|fail.*'
すべての行と一致します^
が、特別な一致者であり、行全体を印刷します。強調表示する式は後で定義されます|
。区切り式の場合は、さらに式を追加できます|
。