Comando Pipable para imprimir em cores?

6

Eu sou um pouco novo em bash scripting, e estou querendo saber se existe um programa ou comando embutido para pipe que irá imprimir em uma cor especificada? Ou há um argumento de eco para fazer isso?

Como eu poderia fazer:

echo Hi | commandhere -arguement blue

e imprimiria "Hi" na cor azul?

    
por TenorB 11.05.2012 / 00:55

4 respostas

8

Eu não sei de nenhum utilitário para impressão colorida, mas você pode fazer isso facilmente com uma função de shell como esta:

# colorize stdin according to parameter passed (GREEN, CYAN, BLUE, YELLOW)
colorize(){
    GREEN="3[0;32m"
    CYAN="3[0;36m"
    GRAY="3[0;37m"
    BLUE="3[0;34m"
    YELLOW="3[0;33m"
    NORMAL="3[m"
    color=$${1:-NORMAL}
    # activate color passed as argument
    echo -ne "'eval echo ${color}'"
    # read stdin (pipe) and print from it:
    cat
    # Note: if instead of reading from the pipe, you wanted to print
    # the additional parameters of the function, you could do:
    # shift; echo $*
    # back to normal (no color)
    echo -ne "${NORMAL}"
}
echo hi | colorize GREEN

Se você quiser conferir outras cores, dê uma olhada em esta lista . Você pode adicionar suporte a qualquer cor, simplesmente criando uma variável adicional nessa função com o nome e o valor corretos.

    
por elias 11.05.2012 / 01:14
2

Eu criei esta função que eu uso em scripts bash.

# Function to echo in specified color
echoincolor () {
    case  in
        "red") tput setaf 1;;
        "green") tput setaf 2;;
        "orange") tput setaf 3;;
        "blue") tput setaf 4;;
        "purple") tput setaf 5;;
        "cyan") tput setaf 6;;
        "gray" | "grey") tput setaf 7;;
        "white") tput setaf 8;;
    esac
    echo "";
    tput sgr0
}

Então eu apenas chamo assim echoincolor green "This text is in green!"

Como alternativa , use printf

# Function to print in specified color
colorprintf () {
    case  in
        "red") tput setaf 1;;
        "green") tput setaf 2;;
        "orange") tput setaf 3;;
        "blue") tput setaf 4;;
        "purple") tput setaf 5;;
        "cyan") tput setaf 6;;
        "gray" | "grey") tput setaf 7;;
        "white") tput setaf 8;;
    esac
    printf "";
    tput sgr0
}

Depois é só chamar assim colorprintf green "This text is in green!"

Lembre-se, echo fornece uma nova linha à direita, enquanto printf não.

    
por HarlemSquirrel 14.05.2015 / 18:18
1

Eu uso este script antigo, nomes hilite.pl, retirado da web, já com a linha "author desconhecido"!

#!/usr/bin/perl -w
### Usage: hilite <ansi command> <target string>
### Purpose: Will read text from standard input and perform specified highlighting
### command before displaying text to standard output.
### License: GNU GPL
# unknown author 

$|=1; # don't buffer i/o
$command = "$ARGV[0]";
$target = "$ARGV[1]";
$color = "\e[" . $command . "m";
$end = "\e[0m";

while(<STDIN>) {
    s/($target)/$color$end/;
    print $_;
}

Então eu posso usá-lo em pipes, para "hilite" a saída de log ou outras coisas, usando regexp / PCRE:

 echo 'hello color world!!' | hilite.pl 34 "[Hh]el[^ ]*" | hilite.pl 43 .orld | hilite.pl 32 "\scolor\s"

Isto irá pintar olá em azul, cor em verde e mundo em fundo amarelo

Você pode ver a lista de cores com (você pode expandir a expressão bash para {01..255} se quiser):

for i in {01..10}  {30..49} {90..110}  ; do echo $i | hilite.pl $i $i ; done
    
por higuita 13.05.2015 / 15:45
1

Há uma resposta muito mais elegante do que qualquer uma dessas:

sudo apt-get install grc

(que também instala grcat )

Agora execute:

echo "[SEVERE] Service is down" | grcat ~/conf.username

Onde conf.myusername contém:

regexp=SEVERE
colours=on_red
count=more

(por algum motivo não consigo encontrar o código correto para "tudo entre aspas")

    
por Sridhar-Sarnobat 01.03.2016 / 01:01