컬러 키워드로 로그를 인쇄하고 싶습니다. 이전에는 다음을 사용했습니다.
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"
}