Compare dois arquivos por um valor maior que

1

Eu tenho uma solicitação para alertar o uso do disco a cada 30 minutos. A saída mais recente é verificar o alerta antigo para evitar enviar o mesmo alerta várias vezes.

#!/bin/bash

#export [email protected]
export [email protected];
#df -PH | grep -vE '^Filesystem|none|cdrom'|awk '{ print $5 " " $6 }' | while read output;
df -PH | grep -vE '^Filesystem|none|cdrom|swdepot'|awk '{ print $5 " " $6 }' > diskcheck.log;

#diskcheck is current output whereas disk_alert is previous runned output

if [ -s "$HOME/DBA/monitor/log/disk_alert.log" ]; then
#Getting variables and compare with old
  usep=$(awk '{ if($1 > 60) print $0 }' $HOME/DBA/monitor/diskcheck.log | cut -d'%' -f1)
  usep1=$(awk '{ if($1 > 60) print $0 }' $HOME/DBA/monitor/log/disk_alert.log | cut -d'%' -f1)
  partition=$(cat $HOME/DBA/monitor/diskcheck.log | awk '{ print $2 }' )
else
   cat $HOME/DBA/monitor/diskcheck.log > $HOME/DBA/monitor/log/disk_alert.log
fi
**echo $usep;
echo $usep1;**
if [ "$usep" -ge 60 ]; then
        if [ "$usep" -eq "$usep1" ]; then
                mail=$(awk '{ if("$usep" == "$usep1") print $0 }' $HOME/DBA/monitor/diskcheck.log)
                echo "Running out of space \"$mail ($usep%)\" on $(hostname) as on $(date)" | mail -s "Disk Space Alert: Mount $mail is $usep% Used" $maillist;
        fi
fi

Saída (ERRO):

66 65 85 66
66 65 85 66
disk_alert.sh: line 19: [: 66
65
85
66: integer expression expected

Eu acho que o problema está nas variáveis ($ usep e $ usep1) que armazena os valores em uma única linha, o que significa (66 65 85 66), mas deve ser

66
65
85
66

Só então:

if [ "$usep" -ge 60 ]; then 
       this condition will pass.

Caro Guru, por favor me ajudem com a solução.

    
por Tom 05.05.2017 / 19:33

1 resposta

1

Vamos investigar esta linha:

usep=$(awk '{ if($1 > 60) print $0 }' $HOME/DBA/monitor/diskcheck.log | cut -d'%' -f1)

Nesse caso, $0 tem valor 66 65 85 66 . Portanto, o comando cut -d'%' não pode encontrar % separador em tal valor e retorna como está.

Deve ser:

usep=$(awk '{ if($1 > 60) print $1 }' $HOME/DBA/monitor/diskcheck.log

onde $1 aponta para o primeiro campo

O mesmo vale para a linha:

usep1=$(awk '{ if($1 > 60) print $0 }' $HOME/DBA/monitor/log/disk_alert.log | cut -d'%' -f1)
    
por 05.05.2017 / 19:45