Extraer tiempo de un archivo de texto

Extraer tiempo de un archivo de texto

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 -ninterruptor 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 grepcon pcreexpresiones regulares está bien:

$ grep -oP 'time=\K[0-9.]+' ip.txt | sort -n
11.7
12.6
17.2
  • -oimprimir solo el patrón coincidente
  • -Putilizar pcre expresiones regulares
  • time=\Kmirada hacia atrás positiva, no forma parte de la salida
  • [0-9.]+uno o más dígitos y .caracteres
  • sort -nordenar numéricamente

con perlsolo:

$ 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}'

información relacionada