Manipolazione di files con UNIX

 

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.