bash scripting - parsing di un log

Ciao a Tutti.

A volte mi capita di dover ripulire un log da infomazioni particolari (come indirizzi IP, hostnames, etc.) per poterli inviare via email. Di solito lo faccio “a mano”, tramite “vi” che in modalità comando può fare sostituzioni con sintassi simile a quella di “sed”.

Mi piacerebbe però creare uno script che faccia automaticamente il parsing.

La “bozza di idea” sarebbe:

VARIABILE1=“hostame1 hostname2 hostname3 hostname4 hostname5”

adesso con sed bisognerebbe cercare tutti questi hostnames e sostituirli con “PIPPO” e ridirigere l’output verso nuovofile.log, ma come? Non credo si possa fare con un ciclo di for, perché ad ogni iterazione verrebbe sovrascritto nuovofile.log.

Il parsing non sarebbe finito qui:

VARIABILE2=“ip_addres1 ip_addres2 ip_addres3 ip_addres4 ip_addres5”

sostituire con “XXX”.

Il risultato finale dovrebbe essere un nuovo file ripulito dalle stringhe da oscurare.

Il meglio che riuscirei a fare io è:

sed s/hostname1/PIPPO/g file.log > file-2.log
sed s/hostname2/PIPPO/g file-2.log > file-3.log
sed s/hostname3/PIPPO/g file-3.log > file-4.log
sed s/hostname4/PIPPO/g file-4.log > file-5.log
sed s/hostname5/PIPPO/g file-5.log > file-6.log
rm -f file-2.log file-3.log file-4.log file-5.log
mv file-6.log nuovofile.log

Sono riuscito a farvi ridere?
Sarebbe bello se sed potesse prendersi le stringhe dalla VARIABILE1.

potresti fare una cosa del genere:
crei un file contenente comandi multipli per sed:

gedit comandi_multipli.sed

inserisci:

{ s/hostname1/PIPPO/g s/hostname2/PIPPO/g s/ip_addres1/xxx.xxx.xxx.xxx/g etc.... }
salva chiudi
dai il comando:

sed -f comandi_multipli.sed file.log

tutte le occorrenze indicate verranno sostituite.

[quote=virus]potresti fare una cosa del genere:

sed -f comandi_multipli.sed file.log

tutte le occorrenze indicate verranno sostituite.[/quote]

Beh… questo è sicuramente un passo avanti, almeno evito quegli orribili passaggi per vari file.

Grazie virus!

de nada

Prendendo spunto dal suggerimento di virus mi è venuto in mente questo:

#!/bin/bash

ARG=1
ERR() {
        echo -e "\n\n\nERRORE: ${1}\n\n\n"
        exit 65
}

CENSURA="hostname1 hostname2 hostname3 hostname4  hostname5 ip_address1 ip_address2 ip_address3 ip_address4"

clear
echo -e "\n\n\n\t*** SCRIPT DI FILE-PARSING ***\n\n\n"
echo -e "(Passa come argomento il nomefile su cui fare parsing)\n\n\n"

if  "$#" -ne "$ARG" ]] ; then
        ERR "Utilizzo corretto -->  `basename $0` nomefile"
fi

FILE=${1}
PARSEFILE="${1}-parsed"

if  ! -f "$FILE" ] ; then
        ERR "Il file $FILE non esiste"
fi

create_sed_commands_list() {
        echo \{ > sed_commands_list
        echo -e "\ts/pippo/client/g" >> sed_commands_list
        echo -e "\ts/pluto/server/g" >> sed_commands_list
        for i in `echo $CENSURA` ; do
                echo -e "\ts/$i/CENSURED_WORD/g" >> sed_commands_list
        done
        echo \} >> sed_commands_list
}

echo -e "\nCreazione sed_commands_list\n"
create_sed_commands_list
if  ! -f "sed_commands_list" ] ; then
        ERR "Creazione FALLITA"
else
        echo -e "\t\t\t...FATTO\n"
fi

echo -e "\nEsecuzione parsing\n"
sed -f sed_commands_list $FILE > $PARSEFILE 2> /dev/null
if  ! -f "$PARSEFILE" ] ; then
        ERR "parsing FALLITO"
else
        echo -e "\t\t\t...FATTO\n"
	echo -e "il nuovo file si chiama $PARSEFILE\n\n\n"
        rm -f sed_commands_list
fi

Che ve ne pare?

molto grazioso.
:slight_smile: