カラーキーワードでログを印刷したいです。以前は、以下を使用しました。
cd ~/Code/Docker/somerepo && docker-compose logs -f my_service \
| grep -v "Successfully connected" \
| grep -v "this operation breaks ==" \
| sed "s/at com\.example\.product/at \x1b[32mcom\.example\.product\x1b[0m/g" \
| sed "s/caused by/\x1b[31mcaused by\x1b[0m/g"
機能として機能します。
get_color
それでは、色定義を抽出してandという関数に入れたいと思いますprint_in_color
。
get_color() {
number=
case "$1" in
RED)
number='31'
;;
GREEN)
number='32'
;;
YELLOW)
number='33'
;;
BLUE)
number='34'
;;
PURPLE)
number='35'
;;
*)
number='38'
;;
esac
echo '\x1b['$number'm'
}
# $1 string, $2 color(RED, YELLOW, BLUE, GREEN, PURPLE)
print_in_color() {
while read data;
do
color=$(get_color $2)
nocolor='\x1b[0m'
echo $1 | sed "s/$1/${color}$1${nocolor}/g"
done;
}
そしてこれを使う
log_color() {
cd ~/Code/Docker/somerepo && docker-compose logs -f my_service \
| grep -v "Successfully connected" \
| grep -v "this operation breaks ==" \
| print_in_color 'com\.example\.product' BLUE \
| print_in_color 'caused by' RED
}
しかし、今は赤だけが印刷されますcaused by
。
別の関数にパイプするパイプを返す関数をどのように定義しますか?
答え1
機能を簡素化しますprint_in_color
。
print_in_color() {
local -r LINE="${1//\//\\\/}"
local -r color=$(get_color "$2")
local -r nocolor='\x1b[0m'
sed "s/\(${LINE}\)/${color}\1${nocolor}/g"
}
データを繰り返す必要はありません。このsed
コマンドは、パイプ入力のデータを受け入れ、結果をパイプ出力に書き込むため、複数の呼び出しをprint_in_color
接続できます。
修正する
機能なしget_color
:
#! /bin/bash
declare -g -r ANSI_CSI="\x1b["
declare -g -r ANSI_RESET="${ANSI_CSI}0m"
declare -g -r -A H_COLORS=(
[RED]="${ANSI_CSI}31m"
[GREEN]="${ANSI_CSI}32m"
[YELLOW]="${ANSI_CSI}33m"
[BLUE]="${ANSI_CSI}34m"
[PURPLE]="${ANSI_CSI}35m"
[OTHER]="${ANSI_CSI}38m"
)
# $1 string, $2 color(RED, YELLOW, BLUE, GREEN, PURPLE)
print_in_color() {
local -r LINE="${1//\//\\\/}"
local -r COLOR=${H_COLORS[${2:-OTHER}]}
sed "s/\(${LINE}\)/${COLOR:-${H_COLORS[OTHER]}}\1${ANSI_RESET}/g"
}