Pagina 1 di 1

Script che copia directory aggiornata con condizioni

Inviato: gio 20 set 2007, 11:51
da fabriBit
Ciao a tutti..
premesso che non ho alcuna esperienza di shell script vi chiedo un aiuto..
dunque...
il mio obiettivo è creare uno script che:
1- monta una directory condivisa di un server windows su /mnt/script_import (cosi funzia:
#mount -o username=pippo,password=pippo //192.168.10.12/backup /mnt/script_import)

2-dentro la directory remota "backup" ci sono i file di log dei server( log vecchi e giornalieri)..
All'interno di questi file di log c'è sempre una stringa "ESITO:OK" e "ESITO:KO"...

Come faccio a fare in modo che mi venga stampato a video o inserito in un file qualsiasi i log del giorno prima e solo quelli che al loro 'interno hanno la stringa "ESITO:KO" oppure che salva in un file soltanto i log con stringa "ESITO:KO"?

spero di essere stato chiaro...
grazie e buona giornata

Inviato: gio 20 set 2007, 13:22
da lamarozzo
non sono un gran praticante di bash, ma farei così. La parte per montare la directory remota l'hai già scritta tu. Poi per trovare tutti i log con meno di 24h che hanno la stringa "ESITO:KO" puoi fare semplicemente:

Codice: Seleziona tutto

find /mnt/script_import -ctime 0 -print | grep "ESITO:KO"
e se vuoi salvarli in un file redirigi l'output:

Codice: Seleziona tutto

find /mnt/script_import -ctime 0 -print | grep "ESITO:KO" > nomefile
spero faccia al caso tuo. A presto ;)

Inviato: gio 20 set 2007, 14:39
da fabriBit
Grazie per la risposta..
non funziona!

mi spiego non dà errori.semplicemente non trova la stringa ESITO:OK
la directory script_import è cosi strutturata:
20070705 (directory)
20070705.log(file)
20070705.short.log(file)
20070706(directory)
20070706.log(file)
20070706.short.log(file)

non capisco perchè non stampa a video la stringa in questione

lamarozzo ha scritto:non sono un gran praticante di bash, ma farei così. La parte per montare la directory remota l'hai già scritta tu. Poi per trovare tutti i log con meno di 24h che hanno la stringa "ESITO:KO" puoi fare semplicemente:

Codice: Seleziona tutto

find /mnt/script_import -ctime 0 -print | grep "ESITO:KO"
e se vuoi salvarli in un file redirigi l'output:

Codice: Seleziona tutto

find /mnt/script_import -ctime 0 -print | grep "ESITO:KO" > nomefile
spero faccia al caso tuo. A presto ;)

Inviato: gio 20 set 2007, 15:33
da targzeta
Premetto che non ho capito quello che vuoi, eccoti qualcosa:

Codice: Seleziona tutto

find /mnt/script_import -ctime 0 -type f -print | xargs sed -n '/ESISTO:OK/p;/ESISTO:KO/p;'
Il comando precedente, per tutti i file presenti nell'albero di directory /mnt/script_import, stampa a video le righe che contengono ESISTO:OK o ESISTO:KO.

Codice: Seleziona tutto

find /mnt/script_import -ctime 0 -type f -print | xargs grep ESISTO:OK
Questo invece, sempre per tutti i file blablabla, stampa a video solo le righe che contengono ESISTO:OK.

Analogamente:

Codice: Seleziona tutto

find /mnt/script_import -ctime 0 -type f -print | xargs grep ESISTO:KO
questo stampa le righe che contengono ESISTO:KO.

Io non ho capito se vuoi stampare a video queste righe, oppure l'intero file che contiene queste righe.

Spina

Inviato: gio 20 set 2007, 16:14
da fabriBit
Lo script che ho posto qui su slacky mi serve per andare a prendere dentro la directory /mnt/script_import tutti i file che al loro interno contengano la stringa "ESITO OK" e "ESITO KO"...vorrei sia stamparli a video e che inserirli dentro un file chiamato file.txt..
Questo perchè:
Dobbiamo generare sript per nagios un plugin che faccia un controllo su di un file e indidui un campo specifico ( nome Host ) e gli abbini lo status di ok o ko ovvero critical o normal

esempio

#> more file.txt

host 01 ok
host02 ok
host03 ko

eseguo lo script
#> ./script.sh - host02
output in uscita lo scrit printa
verifica eseguita ok

#> ./script.sh - host03
verifica eseguita critical ko
spina ha scritto:Premetto che non ho capito quello che vuoi, eccoti qualcosa:

Codice: Seleziona tutto

find /mnt/script_import -ctime 0 -type f -print | xargs sed -n '/ESISTO:OK/p;/ESISTO:KO/p;'
Il comando precedente, per tutti i file presenti nell'albero di directory /mnt/script_import, stampa a video le righe che contengono ESISTO:OK o ESISTO:KO.

Codice: Seleziona tutto

find /mnt/script_import -ctime 0 -type f -print | xargs grep ESISTO:OK
Questo invece, sempre per tutti i file blablabla, stampa a video solo le righe che contengono ESISTO:OK.

Analogamente:

Codice: Seleziona tutto

find /mnt/script_import -ctime 0 -type f -print | xargs grep ESISTO:KO
questo stampa le righe che contengono ESISTO:KO.

Io non ho capito se vuoi stampare a video queste righe, oppure l'intero file che contiene queste righe.

Spina

Inviato: gio 20 set 2007, 16:16
da lamarozzo
[EDIT] messaggio sovrapposto alla risposta di spina. scusate

Inviato: gio 20 set 2007, 20:40
da targzeta
fabriBit ha scritto: #> more file.txt

host 01 ok
host02 ok
host03 ko
Ok, quindi vuoi uno script che generi un file.txt con il formato che ho quotato giusto?

Faccio l'assunzione che il path completo del file non contiene spazi. Se così non fosse lo script va modificato:

Codice: Seleziona tutto

for file in `find /mnt/script_import -ctime 0 -type f`; 
  do 
     if grep -q ESISTO:OK $file; 
          then echo "$file ok"; 
     elif grep -q ESISTO:KO $file; 
          then echo "$file ko";
     fi; 
  done
Questa è una bozza, non è ottimizzato per niente, come vedi può eseguire anche due grep per ogni file incontrato. Dimmi comunque se è quello che vuoi, poi ti posso scrivere qualcosa di meglio.
Inoltre mi devi dire se posso fare l'assunzione che, se esiste nel file la stringa ESISTO:OK o ESISTO:KO, ne esiste solo una delle due ed è univoca (assunzione al quanto ragionevole penso).

Spina

Inviato: ven 21 set 2007, 10:56
da fabriBit
avrai ben capito che non ci capiamo molto di script shell
vabbe' ti spiego il problema

a fronte di un file di log in formato txt dobbiamo con awk determinare 3 tipi di campi

il campo data, nome host, esito del backup ( identificato nel file di testo con "ok" o "ko" )

ora lo script deve sotto richiesta del nome host restituire con un imput ( vedi un print ) a monitor il corrispettivo OK o KO

ovvero

localhost.loacaldomain# ./script.sh -NomeHost
localhost.loacaldomain#

check eseguito data nomehost stato OK
oppure
check eseguito data nomehost stato KO

lo script deve abbinare il nome macchina con gli eventuali campi ok o ko adiacenti nel file di log generato dal sistema di backup file originale












spina ha scritto:
fabriBit ha scritto: #> more file.txt

host 01 ok
host02 ok
host03 ko
Ok, quindi vuoi uno script che generi un file.txt con il formato che ho quotato giusto?

Faccio l'assunzione che il path completo del file non contiene spazi. Se così non fosse lo script va modificato:

Codice: Seleziona tutto

for file in `find /mnt/script_import -ctime 0 -type f`; 
  do 
     if grep -q ESISTO:OK $file; 
          then echo "$file ok"; 
     elif grep -q ESISTO:KO $file; 
          then echo "$file ko";
     fi; 
  done
Questa è una bozza, non è ottimizzato per niente, come vedi può eseguire anche due grep per ogni file incontrato. Dimmi comunque se è quello che vuoi, poi ti posso scrivere qualcosa di meglio.
Inoltre mi devi dire se posso fare l'assunzione che, se esiste nel file la stringa ESISTO:OK o ESISTO:KO, ne esiste solo una delle due ed è univoca (assunzione al quanto ragionevole penso).

Spina

Inviato: ven 21 set 2007, 11:28
da targzeta
L'unica cosa che ho capito è che non ci capiamo :). Diamoci un appuntamento su Instant Messenger, quando ti fà più comodo. Ti mando i miei indirizzi con un Messaggio Privato.

Spina

Inviato: ven 21 set 2007, 18:21
da fabriBit
Ora posso essere più chiaro:
Con questo script( che per semplicità chiamerò mio_script.sh) ho finalmente quello che mi serve:
#!/bin/bash
mount -o username=admin,password=pippo //101.289.133.12/backup /mnt/
cd /mnt
DATA=$(date +%Y%m%d --date='1 day ago')
cat $DATA".short.log"|grep "OK"|awk {'print $1,$7,$11'}
cat $DATA".short.log"|grep "KO"|awk {'print $1,$7,$11'}
cd ..
umount /mnt
exit

mi restituisce DATA NOME-HOST ESITO....e fin qui tutto ok :lol:

chiaro che l'elenco delle macchine è molto lungo..quindi vorrei trovare il modo
di lanciare lo script di cui sopra e passargli come argomento il nome macchina, in modo che mi restituisca l'esito...
esempio

#./mio_script.sh NOME_HOST

check eseguito data nomehost stato OK
oppure
check eseguito data nomehost stato KO



spina ha scritto:L'unica cosa che ho capito è che non ci capiamo :). Diamoci un appuntamento su Instant Messenger, quando ti fà più comodo. Ti mando i miei indirizzi con un Messaggio Privato.

Spina
:lol: