Como colorir algumas das saídas de um script de shell?

5

Eu escrevi um pequeno script Bash, que usa spfquery para verificar o registro SPF do meu domínio, se transmitir todos os endereços IP dos provedores:

#!/bin/bash

# RED="3[1;31m"
GREEN="3[1;32m"
NOCOLOR="3[0m"

email="[my email address]" # deleted for bots not to hound me

declare -a ips=("88.86.120.212" "88.86.120.223" "88.86.120.250" "88.86.120.213" "88.86.120.103" "46.234.104.23" "46.234.104.24")

echo -e "\n\n"

for ip in "${ips[@]}"
do
    echo -e "${GREEN}$ip${NOCOLOR}"
    spfquery -sender $email -ip $ip -helo kolbaba.stable.cz
    echo -e "\n\n"
done

Observe que há RED comentada. Isso é porque gostaria que a mensagem resultante começasse com qualquer uma dessas:

  • fail
  • softfail
  • neutral
  • unknown
  • error
  • none

i.e. não com:

  • pass

para colorir em vermelho.

Mas como fazer isso é um mistério para mim?

    
por Vlastimil 05.12.2017 / 06:56

3 respostas

4

Você gostaria de verificar o código de saída do spfquery e, em seguida, ter um if / else para ver se era um passe ou não. Algo assim:

#!/bin/bash

RED="3[1;31m"
GREEN="3[1;32m"
NOCOLOR="3[0m"

email="[email protected]"

declare -a ips=("88.86.120.212" "88.86.120.223" "88.86.120.250" "88.86.120.213" "88.86.120.103" "46.234.104.23" "46.234.104.24")

echo -e "\n\n"

for ip in "${ips[@]}"
do
    spfquery -sender $email -ip $ip -helo kolbaba.stable.cz

    exit_status=$?
    if [ $exit_status -eq 0 ]; then
        echo -e "${GREEN}$ip${NOCOLOR}"
    else
        echo -e "${RED}$ip${NOCOLOR}"
    fi

    echo -e "\n\n"
done
    
por 05.12.2017 / 07:07
5

Com zsh em vez de bash :

#!/bin/zsh

email="[email protected]"

ips=(88.86.120.{212,223,250,213,103} 46.234.104.{23,24})

print '\n\n'

for ip ($ips) {
  spfquery -sender $email -ip $ip -helo kolbaba.stable.cz &&
    color=green || color=red

  print -P "%F{$color}$ip%f\n"
}

print -P ativa a expansão do prompt nos argumentos em que %F{color} deve definir a cor em primeiro plano e %f para redefini-la.

Observe que o conteúdo das variáveis existentes ( $color e $ip ) também está sujeito à pronta expansão (algo a ser considerado nos casos em que eles podem conter % caracteres (ou mais, se% co_de A opção% está ativada)) e a seqüência de escape (como promptsubst acima) expansão.

Outras formas de acessar cores em \n :

  • a função zsh autoloadable:

    autoload colors; colors
    echo $fg[green]text$reset_color
    
  • o sinalizador de expansão do parâmetro colors , que permite a expansão imediata do conteúdo de uma variável:

    var='%F{green}' reset=%f
    echo ${(%)var}text${(%)reset}
    

    veja também:

    echo ${(%):-green}text${(%):-%f}
    

    ou

    printf '%s\n' "${(%):-green}$text${(%):-%f}"
    

    para garantir que o conteúdo de % seja produzido como está.

  • o módulo $text usado para gravar aplicativos pseudo-gráficos no terminal.

por 05.12.2017 / 07:44
3

I would like the resulting message starting with any of these […] to colorize in red.

Sua pergunta diz que você gostaria de colorir a saída gerada pelo comando spfquery . Isto não é conseguido executando o comando e então emitindo sequências de controle de mudança de cor. O que você está conseguindo com as outras respostas é colorir apenas os endereços IP. Isso pode ser o que você quer, mas não é o que sua pergunta pede.

As ferramentas que você está procurando se isto é o que você realmente quer fazer são os vários utilitários de filtros de colorização, como colorize de István Karaszi , grc de Radovan Garabík e Joakim Andersson colortail . Configure-os para reconhecer os itens apropriados e, em seguida, canalize a saída de spfquery ou, na verdade, todo o loop for , por meio deles.

Leitura adicional

por 05.12.2017 / 11:20