
Ich versuche also, ein Shell-Skript in Linux zu schreiben, das die Roundtrip-Zeit aus einem in einer Textdatei gespeicherten Webserver-Ping extrahiert. Was ich also im Grunde habe, ist eine Textdatei mit folgendem Inhalt:
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
Also habe ich am Ende versucht, mit sed nur die Stellen 17.2, 12.6, 11.7 und mehr aus der Textdatei zu extrahieren. Unten ist meine Sed-Zeile:
sed 's/.*(time=\([0-9]*\(\.[0-9]*\)\{0,1\}\) ms/\1/' pingoutput.txt | sort -n > sortedtime.txt
Diese Zeile extrahierte und sortierte erfolgreich alle Male, die ich brauchte, ABER sie extrahierte auch die wenigen Zeilen aus der Ping-Textdatei, die ich nicht brauchte. Die erstellte Textdatei sah so aus:
--- 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
Wenn es eine Möglichkeit gibt, die Extraktion der unerwünschten Zeilen „---e11699“ nach „Pipe 2“ und „86400 packets“ nach „86532481ms“ der Textdatei zu vermeiden, wäre ich für Ihre Hilfe sehr dankbar!
Antwort1
Ich habe dieses sed verwendet:
sed -n 's/.*time=\([0-9].*\)ms.*/\1/p' times | sort -n
Zu Ihrer Beispieldatei ( 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
Ich erhalte dieses Ergebnis:
sed -n 's/.*time=\([0-9].*\)ms.*/\1/p' times | sort -n
11.7
12.6
17.2
Ich habe den -n
Schalter verwendet, um unerwünschte Zeilen zu entfernen. Von 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.
Antwort2
wenn grep
mit pcre
regulärem Ausdruck ist ok:
$ grep -oP 'time=\K[0-9.]+' ip.txt | sort -n
11.7
12.6
17.2
-o
nur passende Muster drucken-P
Verwenden Sie den regulären PCRE-Ausdrucktime=\K
positiver Lookbehind, nicht Teil der Ausgabe[0-9.]+
eine oder mehrere Ziffern und.
Buchstabensort -n
numerisch sortieren
mit perl
allein:
$ perl -nle 'push(@a,/time=\K([0-9.]+)/g); END{ print foreach sort {$a <=> $b} @a }' ip.txt
11.7
12.6
17.2
- hier wird ein Array mit passenden Mustern gefüllt und am Ende wird ein numerisch sortiertes Array ausgedruckt
Antwort3
grep 'time=' pingoutput.txt | awk '{print $8}'