
Eu tenho o seguinte arquivo de log. Preciso saber se há alguma condição de falha/suspeita usando um script de shell.
Preciso encontrar falha e verificar a palavra anterior, se for maior que 0 então há trabalho para o DBA.
Checking pubs2: Logical pagesize is 4096 bytes
DBCC CHECKSTORAGE for database 'pubs2' sequence 17 completed at Oct 21 2015 3:17PM. 4 faults and 0 suspect conditions were located. 0 checks were aborted. You should investigate the recorded faults, and plan a course of action that will correct them.
Já tentei os seguintes comandos no shell Linux/Bash e está funcionando bem.
FLTCNT=`cat $MAILLOG | grep -oP '\S+(?=\s+faults and)'`
SPTCNT=`cat $MAILLOG | grep -oP '\S+(?=\s+suspect)'`
if [ $FLTCNT -gt 0 ] || [ $SPTCNT -gt 0 ] ; then
FAILED="Y"
# echo "Fault / suspect conditions found"
cat $MAILLOG >> $ERRLOG
fi
Mas quando executo o mesmo em um servidor AIX estou recebendo um erro
grep: illegal option -- o
grep: illegal option -- P
usage: grep [-r] [-R] [-H] [-L] [-E|-F] [-c|-l|-q] [-insvxbhwyu] [-p[parasep]] -e pattern_list...
[-f pattern_file...] [file...]
usage: grep [-E|-F] [-c|-l|-q] [-insvxbhwyu] [-p[parasep]] [-e pattern_list...]
-f pattern_file... [file...]
Responder1
Supondo que você queira fazer algo se alguma das duas strings X faults
e Y suspect
para qualquer valor inteiro positivo X
e Y
diferente de 0
existir no arquivo $MAILLOG
.
if grep -qwE '([1-9]|[0-9]{2,}) (faults|suspect)' "$MAILLOG"; then
# do something
fi
O padrão ([1-9]|[0-9]{2,})
corresponderia a um único dígito maior que zero ou a qualquer número com dois ou mais dígitos.
O padrão (faults|suspect)
corresponderia à string faults
ou suspect
. Você gostaria de incluir checks
lá também, basta usar (faults|suspect|checks)
.
A -q
opção de grep
desativar qualquer saída sem erro que o utilitário produziria de outra forma (estamos interessados apenas no status de saída de grep
, ou seja, se foi capaz de corresponder ao padrão ou não).
A -w
opção faz grep
realizar uma “busca de palavras”. Nesse caso, significa que ele encontrará 10 faults
em vez da substring, 0 faults
pois o zero in 10
não inicia uma nova "palavra", mas 1
sim. Isso também significa que a string 2 faultsmen
(por mais improvável que seja) não acionaria uma correspondência.
O -E
é necessário para suportar expressões regulares estendidas usando alternância ( |
).
Responder2
Você poderia tentar usar o grep:
grep -c "your word to match" /log/file
Por exemplo:
$ grep -c "upgraded" /var/log/pacman.log
244