색상을 구성하는 함수를 반복적으로 호출하여 색상 로그를 인쇄하려면 어떻게 해야 합니까?

색상을 구성하는 함수를 반복적으로 호출하여 색상 로그를 인쇄하려면 어떻게 해야 합니까?

컬러 키워드로 로그를 인쇄하고 싶습니다. 이전에는 다음을 사용했습니다.

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"
}

관련 정보