
Así que estoy intentando escribir un script de shell en Linux que extraiga el tiempo de ida y vuelta de un ping del servidor web almacenado en un archivo de texto. Básicamente lo que tengo es un archivo de texto con esto:
PING e11699.b.akamaiedge.net (104.100.153.112) 56(84) bytes of data.
64 bytes from a104-100-153-112.deploy.static.akamaitechnologies.com (104.100.153.112): icmp_seq=1 ttl=60 time=17.2ms
64 bytes from a104-100-153-112.deploy.static.akamaitechnologies.com (104.100.153.112): icmp_seq=2 ttl=60 time=12.6ms
64 bytes from a104-100-153-112.deploy.static.akamaitechnologies.com (104.100.153.112): icmp_seq=3 ttl=60 time=11.7ms
... (a bunch more ping responses here)
--- e11699.b.akamaiedge.net ping statistics ---
86400 packets transmitted, 86377 received, 0% packet loss, time 86532481ms
rtt min/avg/max/mdev = 6.281/18.045/1854.971/28.152 ms, pipe 2
Así que terminé usando sed para intentar extraer solo 17.2, 12.6, 11.7 y más veces del archivo de texto. A continuación está mi línea sed:
sed 's/.*(time=\([0-9]*\(\.[0-9]*\)\{0,1\}\) ms/\1/' pingoutput.txt | sort -n > sortedtime.txt
Esta línea se extrajo y ordenó con éxito todas las veces que necesitaba, PERO también extrajo las pocas líneas del archivo de texto de ping que no necesitaba. El archivo de texto que había creado tenía este aspecto:
--- e11699.b.akamaiedge.net ping statistics ---
86400 packets transmitted, 86377 received, 0% packet loss, time 86532481ms
rtt min/avg/max/mdev = 6.281/18.045/1854.971/28.152 ms, pipe 2
11.7
12.6
17.2
...
86400 packets transmitted, 86377 received, 0% packet loss, time 86532481ms
Si hay alguna forma de evitar la extracción de las líneas no deseadas "---e11699" a "pipe 2" y "86400 paquetes" a "86532481ms" del archivo de texto, ¡realmente agradecería la ayuda!
Respuesta1
Usé este sed:
sed -n 's/.*time=\([0-9].*\)ms.*/\1/p' times | sort -n
En su archivo de ejemplo ( times
):
PING e11699.b.akamaiedge.net (104.100.153.112) 56(84) bytes of data.
64 bytes from a104-100-153-112.deploy.static.akamaitechnologies.com (104.100.153.112): icmp_seq=1 ttl=60 time=17.2ms
64 bytes from a104-100-153-112.deploy.static.akamaitechnologies.com (104.100.153.112): icmp_seq=2 ttl=60 time=12.6ms
64 bytes from a104-100-153-112.deploy.static.akamaitechnologies.com (104.100.153.112): icmp_seq=3 ttl=60 time=11.7ms
... (a bunch more ping responses here)
--- e11699.b.akamaiedge.net ping statistics ---
86400 packets transmitted, 86377 received, 0% packet loss, time 86532481ms
rtt min/avg/max/mdev = 6.281/18.045/1854.971/28.152 ms, pipe 2
Obtengo este resultado:
sed -n 's/.*time=\([0-9].*\)ms.*/\1/p' times | sort -n
11.7
12.6
17.2
Utilicé el -n
interruptor para deshacerme de líneas no deseadas. De man sed
:
-n By default, each line of input is echoed to the standard output after all of the commands have been applied to it. The -n option suppresses this behavior.
Respuesta2
si grep
con pcre
expresiones regulares está bien:
$ grep -oP 'time=\K[0-9.]+' ip.txt | sort -n
11.7
12.6
17.2
-o
imprimir solo el patrón coincidente-P
utilizar pcre expresiones regularestime=\K
mirada hacia atrás positiva, no forma parte de la salida[0-9.]+
uno o más dígitos y.
caracteressort -n
ordenar numéricamente
con perl
solo:
$ perl -nle 'push(@a,/time=\K([0-9.]+)/g); END{ print foreach sort {$a <=> $b} @a }' ip.txt
11.7
12.6
17.2
- aquí se completa una matriz con patrones coincidentes y luego, al final, se imprime la matriz ordenada numéricamente
Respuesta3
grep 'time=' pingoutput.txt | awk '{print $8}'