Como encontrar a palavra antes de uma partida

Como encontrar a palavra antes de uma partida

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 faultse Y suspectpara qualquer valor inteiro positivo Xe Ydiferente de 0existir 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 faultsou suspect. Você gostaria de incluir checkslá também, basta usar (faults|suspect|checks).

A -qopção de grepdesativar 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 -wopção faz greprealizar uma “busca de palavras”. Nesse caso, significa que ele encontrará 10 faultsem vez da substring, 0 faultspois o zero in 10não inicia uma nova "palavra", mas 1sim. 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

informação relacionada