Regexp no fluxo de dados

2

Eu quero testar se, no meu fluxo de dados, há algo e um código de saída.

Eu uso o monitor gammu, que fornece um fluxo de dados, por exemplo:

[root@MYSERVER ~]# gammu monitor
Press Ctrl+C to break...
Entering monitor mode...

Enabling info about incoming SMS    : No error.
Enabling info about incoming CB     : Some functions not available for your system (disabled in config or not written).
Enabling info about calls           : No error.
Enabling info about USSD            : No error.
SIM phonebook        :  42 used,  38 free
Dialled numbers      :   2 used,  28 free
Received numbers     :   0 used,  30 free
Missed numbers       :   0 used,   0 free
Phone phonebook      :  55 used, 945 free
ToDos                :   0 used, 353 free
Calendar             :  27 used, 353 free
Battery level        : 25 percent
Charge state         : battery connected, but not powered from battery
Signal strength      : -83 dBm
Network level        : 100 percent
SIM SMS status       : 0 used, 0 unread, 13 locations
Phone SMS status     : 1 used, 0 unread, 200 locations
Network state        : home network
Network              : 208 10 (SFR, France), LAC 6414, CID 0000AC99

Eu achei que poderia fazer algo assim em meu script bash:

#!/bin/bash

gammu monitor |
tail -n 1 |
if[[ "$1"=="Press*" ]]
then
  echo "yes"
else
  echo "no"
fi;

Para verificar se, por exemplo, a linha do nível da bateria, o número é > para 50 (saída 0), > 25 saida 1 e < 25 saída 2. Atm, eu só queria testar se a primeira linha começa com Press mas ofc não funciona!

Objetivos: O Nagios usa este script como um plugin, para verificar se gammu monitor retorna valores bons, se não, vai para warning ou critical .

    
por Nico 21.08.2013 / 11:17

4 respostas

0

Obrigado a todos, esta é a solução final:)

#!/bin/bash

battery=$(gammu monitor 2>&1 | grep -e "Battery level" | tr -s " " | cut -f 4 -d" " | tail -n 1)
echo $battery
if [[ $battery -ge 50 ]]; then
    # Exit 0 = OK
    echo OK
    exit 0
elif [[ $battery -ge 30 ]]; then
    # Exit 1 = WARNING
    echo WARNING
    exit 1
elif [[ $battery -ge 0 ]]; then
    # Exit 2 = CRITICAL
    echo CRITICAL
    exit 2
else
    # Exit 3 = Unknown
    echo UNKNOWN
    exit 3
fi
    
por 23.08.2013 / 10:34
0

Neste exemplo, estou tentando fornecer um conceito mais claro do que está acontecendo. Manipule o script um pouco e você terá o resultado que deseja.

#!/bin/bash
obtain_level=$(gammu monitor | awk '/Battery level/{print $4}') 
 if (( obtain_level <= 25 )) 
  then 
    echo "less than 25"
 elif (( obtain_level >= 26 || obtain_level <= 50 )) 
 then 
   echo "between 25 and 50" 
 else 
   echo "good" 
 fi
    
por 21.08.2013 / 13:06
0

Basta usar grep :

gammu monitor 2>&1 | grep -e "Battery level" | tr -s " " | cut -f 4 -d" "

Isso deve fornecer a porcentagem como um número.

Você pode então envolver o comando e usá-lo como uma variável:

level=$(gammu monitor 2>&1 | grep -e "Battery level" | tr -s " " | cut -f 4 -d" ")
if [[ $level -ge 50 ]]; then
    exit 0
elif [[ $level -ge 25 ]]; then
    exit 1
else
    exit 2
fi

Meu entendimento é que gammu monitor sai após exibir essa informação.

    
por 21.08.2013 / 11:26
0
gammu monitor | awk '/^Battery level/{exit($4 < 25 ? 2 : $4 <= 50)}'

Acima, usando o operador condition ? true-part : false-part ternary encontrado em vários idiomas (C, perl, Java ... . para citar apenas alguns). Se $4 < 25 , retornar 2, retorne o resultado da expressão lógica $4 <= 50 (que é 1 quando verdadeiro e 0 caso contrário).

    
por 21.08.2013 / 11:59