Consideriamo un file processing.log e supponiamo di doverlo parsare per controllare se si siano verificati degli errori.
-
Una soluzione pure-database vedrebbe una procedura che legga il file dalla cartella in esame ed effettui una lettura sequenziale ricercando i pattern desiderati. Dovremmo prima referenziare la cartella con un oggetto DIRECTORY, assegnare i GRANT in lettura ed utilizzare il package UTL_FILE per accedere al file.
-
Una soluzione più veloce, adatta ai sistemi UNIX, è quella di sfruttare i comandi nativi del sistema operativo.
Posto che il contenuto del log sia:
Start processing at 07/07/2009 18:39:40
Operation type = LOADING
Archiving old records
Loading new records
Total records = 131.000
Updating tables
End processing, result code = 145
Un semplice script parse.sh potrebbe essere:
#!/bin/bash
FILE=processing.log# Leggo il tipo dalla seconda riga
LINE=`sed -n 2p $FILE`
IDX=`expr index "$LINE" =`
TYPE=`echo ${LINE:$IDX}`# Cerco una riga e la elaboro
LINE=`cat $FILE | grep "Total records"`
IDX=`expr index "$LINE" =`
RECORDS=`echo ${LINE:$IDX}`# Leggo il return code dall'ultima riga
LINE=`tail -1 processing.log`
IDX=`expr index "$LINE" =`
STATUS=`echo ${LINE:$IDX}`if [ $STATUS -ne 0 ]; then
echo "No records loaded" | mailx -s "$TYPE error" mmaggi75@gmail.com -- -r from@staff.it
else
echo "$RECORDS loaded" | mailx -s "$TYPE success" mmaggi75@gmail.com -- -r from@staff.it
fi
Ecco alcuni spunti interessanti:- l’utilizzo del comando sed per estrarre la seconda riga del file;
- l’utilizzo combinato dei comandi cat e grep per estrarre una riga che segua un pattern di ricerca;
- l’utilizzo di tail per accedere all’ultima riga del file;
- l’estrazione di una sottostringa attraverso l’uso di echo con un indice calcolato mediante il comando expr index.
Al termine del parsing viene fatto un controllo e viene inviata una mail di riepilogo, sfruttando il mailx di UNIX.