Como fazer um OR grep (com diferentes configurações de GREP_COLOR)

1

Então, quero destacar o status dos serviços em um dinâmico. Atualmente, estou usando o seguinte comando para php-fpm:

service php5-fpm status|grep Active|cut -d':' -f2-

Eu tentei várias soluções para conseguir isso. Os dois seguintes estão fazendo um ótimo trabalho para detectar 1 / quando tudo funciona bem 2 / todos os outros casos.

service php5-fpm status|grep Active|cut -d':' -f2-|GREP_COLOR='1;32' grep --color=always " active \(.*\)"

service php5-fpm status|grep Active|cut -d':' -f2-|GREP_COLOR='1;31' grep --color=always -E ".* \(.*\)"

O que eu tentei fazer é usar o || para tê-los no mesmo comando. Isso está funcionando bem quando o primeiro grep retorna 0, mas quando ele falha e retorna 1, o segundo grep parece não funcionar.

service php5-fpm status|grep Active|cut -d':' -f2-|(GREP_COLOR='1;32' grep --color=always -E " active \(.*\)" || GREP_COLOR='1;31' grep --color=always -E ".* \(.*\)")

Quando executado com o bash -x, recebo a seguinte saída:

+ GREP_COLOR='1;32'
+ grep --color=always -E ' active \(.*\)'
+ cut -d: -f2-
+ grep Active
+ service php5-fpm status
+ GREP_COLOR='1;31'
+ grep --color=always -E '.* \(.*\)'

Então ... eu não tenho ideia agora, e espero que alguém veja onde estou fazendo algo errado.

    
por V.Frenot 23.03.2017 / 14:20

2 respostas

2
Where will the 2nd grep get it's input from when the 1st grep fails?
Coz, grep1 consumes all the stdin with nothing left for grep2.In the
case of grep1 succeeding, grep2 never runs so is not an issue.

We may rig it up like the following to achieve what you want:

#/bin/sh
service php5-fpm status |
grep Active |
cut -d':' -f2- | tee /tmp/log |
GREP_COLOR='1;32' grep --color=always -E " active \(.*\)" - ||
GREP_COLOR='1;31' grep --color=always -E ".* \(.*\)") /tmp/log
    
por 23.03.2017 / 14:36
0

Ok, então, aqui está minha própria solução, baseada no comentário do Rakesh Sharma à minha pergunta, já que eu não queria criar um arquivo temporário.

function service_status() {
    status='service $1 status | grep Active | cut -d':' -f2-'
    echo "$status" | GREP_COLOR='1;32' grep --color=always -E "^ active \(.*\)" || \
    echo "$status" | GREP_COLOR='1;31' grep --color=always -E ".* \(.*\)"
}
    
por 23.03.2017 / 14:49