Script che copia directory aggiornata con condizioni

Postate qui per tutte le discussioni legate a Linux in generale.

Moderatore: Staff

Regole del forum
1) Citare sempre la versione di Slackware usata, la versione del Kernel e magari anche la versione della libreria coinvolta. Questi dati aiutano le persone che possono rispondere.
2) Per evitare confusione prego inserire in questo forum solo topic che riguardano appunto Gnu/Linux in genere, se l'argomento è specifico alla Slackware usate uno dei forum Slackware o Slackware64.
3) Leggere attentamente le risposte ricevute
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
fabriBit
Linux 1.x
Linux 1.x
Messaggi: 160
Iscritto il: lun 18 lug 2005, 0:00
Località: roma

Script che copia directory aggiornata con condizioni

Messaggio 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

Avatar utente
lamarozzo
Linux 3.x
Linux 3.x
Messaggi: 732
Iscritto il: gio 14 lug 2005, 0:00
Desktop: xfce
Distribuzione: archlinux
Località: Roma

Messaggio 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 ;)

fabriBit
Linux 1.x
Linux 1.x
Messaggi: 160
Iscritto il: lun 18 lug 2005, 0:00
Località: roma

Messaggio 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 ;)

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6643
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Messaggio 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
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

fabriBit
Linux 1.x
Linux 1.x
Messaggi: 160
Iscritto il: lun 18 lug 2005, 0:00
Località: roma

Messaggio 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

Avatar utente
lamarozzo
Linux 3.x
Linux 3.x
Messaggi: 732
Iscritto il: gio 14 lug 2005, 0:00
Desktop: xfce
Distribuzione: archlinux
Località: Roma

Messaggio da lamarozzo »

[EDIT] messaggio sovrapposto alla risposta di spina. scusate

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6643
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Messaggio 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
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

fabriBit
Linux 1.x
Linux 1.x
Messaggi: 160
Iscritto il: lun 18 lug 2005, 0:00
Località: roma

Messaggio 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

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6643
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Messaggio 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
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

fabriBit
Linux 1.x
Linux 1.x
Messaggi: 160
Iscritto il: lun 18 lug 2005, 0:00
Località: roma

Messaggio 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:

Rispondi