Quero imprimir logs com palavras-chave coloridas. Anteriormente eu usava:
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"
como uma função e funciona.
Agora eu quero extrair a definição de cor e colocá-la em uma função chamada 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;
}
E usá-lo como
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
}
Mas agora só imprime caused by
em vermelho.
Como eu poderia definir uma função para retornar um pipe a pipe em outra função?
Basta simplificar sua
print_in_color
função:Você não precisa fazer um loop nos dados de entrada. O
sed
comando aceita dados na entrada do pipe e grava o resultado na saída do pipe para que você possa encadear muitasprint_in_color
chamadasATUALIZAR
Sem
get_color
função: