Newsgroup: it.comp.os.linux.iniziare
Titolo: Ping data e ora - script Bash

Ciao a tutti,
ho creato questo script in modo che sia presente data e ora dentro il 
risultato del comando ping:
 
 
#!/bin/bash
 
echo -n "Inserisci l'indrizzo ip da pingare: > "
read ip
 
ping -c 10 $ip | while read x; do echo "$(date): $x"; done
 
 
Il risultato è il seguente :
 
$ bash ping_data_ora.sh
Inserisci l'indrizzo ip da pingare: > 10.24.59.160
mer  3 feb 2016, 14.16.37, CET: PING 10.24.59.160 (10.24.59.160) 56(84) 
bytes of data.
mer  3 feb 2016, 14.16.37, CET: 64 bytes from 
10.24.59.160
: icmp_seq=1 
ttl=127 time=3.36 ms
mer  3 feb 2016, 14.16.38, CET: 64 bytes from 
10.24.59.160
: icmp_seq=2 
ttl=127 time=1.82 ms
mer  3 feb 2016, 14.16.39, CET: 64 bytes from 
10.24.59.160
: icmp_seq=3 
ttl=127 time=2.06 ms
mer  3 feb 2016, 14.16.40, CET: 64 bytes from 
10.24.59.160
: icmp_seq=4 
ttl=127 time=5.65 ms
mer  3 feb 2016, 14.16.41, CET: 64 bytes from 
10.24.59.160
: icmp_seq=5 
ttl=127 time=2.96 ms
mer  3 feb 2016, 14.16.42, CET: 64 bytes from 
10.24.59.160
: icmp_seq=6 
ttl=127 time=10.3 ms
mer  3 feb 2016, 14.16.43, CET: 64 bytes from 
10.24.59.160
: icmp_seq=7 
ttl=127 time=11.2 ms
mer  3 feb 2016, 14.16.44, CET: 64 bytes from 
10.24.59.160
: icmp_seq=8 
ttl=127 time=6.67 ms
mer  3 feb 2016, 14.16.45, CET: 64 bytes from 
10.24.59.160
: icmp_seq=9 
ttl=127 time=2.20 ms
mer  3 feb 2016, 14.16.46, CET: 64 bytes from 
10.24.59.160
: icmp_seq=10 
ttl=127 time=4.77 ms
mer  3 feb 2016, 14.16.46, CET:
mer  3 feb 2016, 14.16.46, CET: --- 10.24.59.160 ping statistics ---
mer  3 feb 2016, 14.16.46, CET: 10 packets transmitted, 10 received, 0% 
packet loss, time 9037ms
mer  3 feb 2016, 14.16.46, CET: rtt min/avg/max/mdev = 
1.823/5.112/11.222/3.229 ms
 
 
Vorrei ottenere un risultato differente tipo questo:
 
$ bash ping_data_ora.sh
Inserisci l'indrizzo ip da pingare: > 10.24.59.160
mer  3 feb 2016, 14.16.37, CET: PING 10.24.59.160 (10.24.59.160) 56(84) 
bytes of data.
mer  3 feb 2016, 14.16.37, CET: 64 bytes from 
10.24.59.160
: icmp_seq=1 
ttl=127 time=3.36 ms
mer  3 feb 2016, 14.16.38, CET: 64 bytes from 
10.24.59.160
: icmp_seq=2 
ttl=127 time=1.82 ms
mer  3 feb 2016, 14.16.39, CET: 64 bytes from 
10.24.59.160
: icmp_seq=3 
ttl=127 time=2.06 ms
mer  3 feb 2016, 14.16.40, CET: 64 bytes from 
10.24.59.160
: icmp_seq=4 
ttl=127 time=5.65 ms
mer  3 feb 2016, 14.16.41, CET: 64 bytes from 
10.24.59.160
: icmp_seq=5 
ttl=127 time=2.96 ms
mer  3 feb 2016, 14.16.42, CET: 64 bytes from 
10.24.59.160
: icmp_seq=6 
ttl=127 time=10.3 ms
mer  3 feb 2016, 14.16.43, CET: 64 bytes from 
10.24.59.160
: icmp_seq=7 
ttl=127 time=11.2 ms
mer  3 feb 2016, 14.16.44, CET: 64 bytes from 
10.24.59.160
: icmp_seq=8 
ttl=127 time=6.67 ms
mer  3 feb 2016, 14.16.45, CET: 64 bytes from 
10.24.59.160
: icmp_seq=9 
ttl=127 time=2.20 ms
mer  3 feb 2016, 14.16.46, CET: 64 bytes from 
10.24.59.160
: icmp_seq=10 
ttl=127 time=4.77 ms
  --- 10.24.59.160 ping statistics ---
10 packets transmitted, 10 received, 0% packet loss, time 9037ms
rtt min/avg/max/mdev = 1.823/5.112/11.222/3.229 ms
 
Come posso eliminare la data e l'ora nelle ultime tre righe?
 
Qualche suggerimento?
Grazie 1000

 Come posso eliminare la data e l'ora nelle ultime tre righe?
 
 
#!/bin/bash
n=3
i=0
echo -n "Inserisci l'indrizzo ip da pingare: > "
read ip
ping -c $n $ip | while read x; do
    if (($i < $n)); then
	echo "$(date): $x"
    else
	echo "$x"
    fi
    i=$(($i + 1))
done
exit 0
 

 exit 0
 
 
Ti ringrazio.

 exit 0
 
Con il ciclo for non funziona :-(
 
Volevo inserire più indirizzi ip ma mi da errore :-(
 
#!/bin/bash
n=10
i=0
echo -n "Inserisci l'indrizzo ip da pingare: > "
read ip
for x in ip
do
ping -c $n $x | while read x
     if (($i < $n)); then
         echo "$(date): $x"
     else
         echo "$x"
     fi
i=$(($i + 1))
done
exit 0
 
 
Errore :
===================================================================
ping_data_ora.sh: riga 32: errore di sintassi vicino al token non atteso 
"done"
ping_data_ora.sh: riga 32: `done'
==================================================================
 

 exit 0
 
L'errore credo sia dovuto piu` che altro a fretta e trascuratezza nello
scrivere, per cui non hai curato una corretta indentazione del codice,
 
https://it.wikipedia.org/wiki/Indentazione#Informatica
 
 
cosa che ti avrebbe facilitato molto nell'individuazione dell'errore.
 
Guarda come ad esempio da me Emacs indenta automaticamente il tuo
script:
 
http://s24.postimg.org/eftdxzcf9/ad_mentula_canis.png
 
 
Dato che il contenuto dei cicli for, while ed until deve essere
preceduto da un 'do' e terminare con un 'done' credo che ti appaia
evidente che hai scritto il ciclo for dimenticandoti di terminarlo col
'done', mentre viceversa nel ciclo while hai dimenticato il 'do'.
 
In effetti se correggi cosi`:
 
#!/bin/bash
### perche` cavolo hai ricorretto con 'n=10' ?
### hai tempo da perdere? siamo in fase di test ...
n=3
i=0
echo -n "Inserisci l'indrizzo IP da pingare: > "
read ip
for x in $ip
do
    ping -c $n $ip | while read x
    do
	if (($i <= $n))
	then
	    echo "$(date): $x"
	else
	    echo "$x"
	fi
	i=$(($i + 1))
    done
done
exit 0
 
e provi ad eseguire, vedi che funziona anche se poi non fa cio` che
vorresti tu, cioe` inserire più indirizzi IP.
 
Per capire il perche` basta che ti traduci in italiano il significato di
queste 3 righe che hai scritto:
 
echo -n "Inserisci l'indrizzo ip da pingare: > "
read ip
for x in ip
 
dove gli dici di ciclare i contenuti di una variabile che corrisponde
naturalmete ad un solo IP, mentre tu ne vorresti ciclare alcuni.
 
Per risolvere la questione dipende un po' da cio` che vuoi, cioe`
preferisci che la tua lista di IP sia presente all'interno dello script
oppure vuoi che lo script all'infinito (in realta` finche` l'utente non
lo termina con un ^C  o in altro modo) riproponga sempre di editare un
nuovo indirizzo?
 
Nel primo caso credo che ti convenga innanzitutto impratichirti un poco
con gli array, ad es.:
 
http://www.pluto.it/files/ildp/guide/abs/arrays.html
 
 
mentre se vuoi che lo script cicli all'infinito la stessa richiesta di
digitazione di un IP ti basta fare cosi`:
 
#!/bin/bash
n=3
i=0
###   Ciclo infinito, In alternativa potevi usare:
###   'while [ 1 ]' oppure 'while [ true ]'
for (( ; ; )) 
do
    echo
    echo "Per uscire premere [Ctrl]+C"
    echo
    echo -n "Inserisci l'indrizzo IP da pingare: > "
    read ip
    ping -c $n $ip | while read x
    do
	if (($i <= $n))
	then
	    echo "$(date): $x"
	else
	    echo "$x"
	fi
	i=$(($i + 1))
    done
done
exit 0
 
 
 


for x in $ip