Newsgroup: it.comp.os.linux.sys
Titolo: Verificare contenuto di una stringa...ehm..

Ciao a tutti..
mi sono bloccato nel bel mezzo di uno script...
Ho realizzato uno script che mi genera un log file con questa
sintassi...
1234045314 07/02/09 23:23:34 IP: 192.168.5.1 port 53 UDP is now DOWN
1234045398 07/02/09 23:24:58 IP: 192.168.5.254 is now DOWN
1234045434 07/02/09 23:23:34 IP: 192.168.5.1 port 53 UDP is now DOWN
In un altro script sto creando una funzione che deve essere in grado
di verificare riga per riga il file di log alla ricerca di un
determinato 'evento'.
a questo punto ho queste variabili...
$2=192.168.5.1
$3=53
$4=UDP
$5=DOWN
e tramite un controllo 'if' che non sono ancora riuscito a fare devo
controllare che ogni singola riga matchi tutti i valori...
Facendo così...
if [[ $LOG_LINE == *$3*  ]] && [[ $LOG_LINE == *$4* ]] && [[ $LOG_LINE
== *$5* ]]; then
 echo $LOG_LINE
fi
e mi restiuisce correttamente solo
1234045314 07/02/09 23:23:34 IP: 192.168.5.1 port 53 UDP is now DOWN
1234045434 07/02/09 23:23:34 IP: 192.168.5.1 port 53 UDP is now DOWN
però non fa nessun controllo utilizzando $2 ovvero l' IP.
se all' if di prima aggiungo:
if [[ $LOG_LINE == *$2*  ]] && [[ $LOG_LINE == *$3*  ]] &&
[[ $LOG_LINE == *$4* ]] && [[ $LOG_LINE == *$5* ]]; then
 echo $LOG_LINE
fi
lo script segnala un errore:
./notifica-mail.sh: line 51: - : syntax error: operand expected (error
token is " ")
che non ho idea di cosa voglia indicarmi...
Ho già provato diverse combinazioni ma non riesco a concludere questo
controllo...
Sapete indicarmi un modo, magari anche più carino, di controllare che
una stringa contenga diversi valori?
Grazie a tutti!

 una stringa contenga diversi valori?
Ed usare grep/egrep?
Tipo:
cat file.log | grep $A | grep $B | grep $C | grep $D
Restituisce solo le righe dove le 4 stringhe
sono contemporaneamente presenti.
Ovviamente si puo` semplificare, usando "egrep", ma
forse non ne vale la pena, a meno che non interessi
anche essere sicuri dell'ordine con cui le varie
stringhe devono presentarsi.
Altrettanto ovviamente, quella catena puo` essere
usata in un "if".
bye,
-- 
piergiorgio


wrote:

A dirti il vero ho fatto anche la prova con uan catena di grep ma
ottengo sempre lo stesso errore ed è molto più lento...
echo $2
echo $3
echo $4
echo $5
if [ `echo $LOG_FILE | grep $2 | grep $3 | grep $4 | grep $5` ];
 then
 echo $LOG_LINE
fi
192.168.5.1
53
UDP
DOWN
./notifica-mail.sh: line 55: - : syntax error: operand expected (error
token is " ")
Sempre lo stesso identico errore... e continuo a non capacitarmene...

 fi
Non capisco esattamente cosa questo debba fare.
Se devi semplicemente stampare le righe che
corrispondono all'evento cercato, allora non
serve il blocco "if", bastano i "grep", ovviamente.
Poi, cos'e` $LOG_FILE e cosa e` $LOG_LINE?
Infine, facendo qualcosa come:
T=`echo $LOG_FILE | grep $2 | grep $3 | grep $4 | grep $5`
if [ -n "$T" ]
then
   echo bla bla
fi
Mi funziona, almeno usando le stringhe direttamente, invece
di $1, $2, etc.
bye,
-- 
piergiorgio


wrote:

Si scusami LOG_FILE non c'entra nulla era LOG_LINE...
e ho anche trovato la causa... semplicemente l' errore era portato da
un istruzione all' interno del ciclo if...


Ma fai veramente un ciclo linea per linea? Se e` cosi`, credo tu abbia preso la 
strada sbagliata. Io farei un grep unico su tutto il file e poi leggerei il 
risultato:
while read LOG_LINE; do
   echo "${LOG_LINE}" # O qualunque cosa tu voglia fare
done < <( grep "$1" "${LOG_FILE}" | grep "$2" | grep "$3" | grep "$4" | grep "$5" )
Credo sarebbe ancora meglio fare una sola egrep... Ma questo te lo lascio come 
esercizio ;-)
Ciao,
-- 
        Roberto Divia`              Love at first sight is one of the greatest
Dep:PH Bat:53 Mailbox:C02110      labour-saving devices the world has ever seen
Route de Meyrin 385               ---------------------------------------------
Case Postale                                Phone:  
+41-22-767-4994
CH-1211 Geneve 23 CERN                      Fax:    
+41-22-767-9585
Switzerland                                 E-Mail: 
Robert...@cern.ch

 - Mostra testo citato -
No il ciclo legge ogni singola riga dopo dichè con un
if [ ... ] && [ ... ] && [ ... ] then
l' idea di usare il grep o egrep non mi piace...
ho preferito usare quanto messo a disposizione da bash 3, ovvero l'
operatore =~  e le regex

 if [ ... ] && [ ... ] && [ ... ] then
Quindi hai un ciclo linea per linea e il grep viene dopo? Male, molto male...
Ciao,
-- 
        Roberto Divia`              Love at first sight is one of the greatest
Dep:PH Bat:53 Mailbox:C02110      labour-saving devices the world has ever seen
Route de Meyrin 385               ---------------------------------------------
Case Postale                                Phone:  
+41-22-767-4994
CH-1211 Geneve 23 CERN                      Fax:    
+41-22-767-9585
Switzerland                                 E-Mail: 
Robert...@cern.ch

 Switzerland                                 E-Mail: 
Roberto.Di...@cern.ch
No non ci siamo capiti:
ho una cosa simile...
while read TIME EMAIL A B C D BHO; do
 if [[ ! "$EMAIL" =~ ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]
{2,4}$ ]]; then
  echo "Non è un indirizzo mail valido..."
 fi
done < logfile.txt
una cosa simile ho fatto...che con un unico ciclo verifica tutti i
valori letti di ogni singola riga...
Penso di aver preso la via giusta ma non ne sono del tutto certo non
essendo un gran mago di bash...se così fosse correggimi mi fai un
altro esempio per ottenere comunque lo stesso risultato?
PS: vedo molta gente che fa script bash in svariate maniere, c'è
qualche documento che spiega quali sono le sintassi migliori in
termini di prestazioni e leggibilità?

 termini di prestazioni e leggibilità?
Mah, immagino che qualcosa ci sia, io ho imparato
su "Unix" di K&P, ma c'e` sicuramente altro.
bye,
-- 
piergiorgio


wrote:

mm provero a darci un occhiata

 valori letti di ogni singola riga...
Ci siamo capiti benissimo.
Prova a fare delle prove sul tempo richiesto da un ciclo:
while read line; do <test>...; done < logfile.txt
paragonato ad un ciclo:
while read line; do ...; done < <( grep <...> logfile.txt )
In altre parole, la differenza tra:
1) leggere il file riga per riga e verificarne il contenuto
2) cercare *prima* le linee "interessanti" e poi leggere solo quelle
Prova su un file di una certa dimensione e vedrai.
Ciao,
-- 
        Roberto Divia`              Love at first sight is one of the greatest
Dep:PH Bat:53 Mailbox:C02110      labour-saving devices the world has ever seen
Route de Meyrin 385               ---------------------------------------------
Case Postale                                Phone:  
+41-22-767-4994
CH-1211 Geneve 23 CERN                      Fax:    
+41-22-767-9585
Switzerland                                 E-Mail: 
Robert...@cern.ch