
Итак, я пытаюсь написать скрипт оболочки в Linux, который извлечет время обратного пути из пинга веб-сервера, сохраненного в текстовом файле. Так что у меня в основном есть текстовый файл с этим:
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
Поэтому я в итоге использовал sed, чтобы попытаться извлечь из текстового файла только 17.2, 12.6, 11.7 и другие значения. Ниже приведена моя строка sed:
sed 's/.*(time=\([0-9]*\(\.[0-9]*\)\{0,1\}\) ms/\1/' pingoutput.txt | sort -n > sortedtime.txt
Эта строка успешно извлекла и отсортировала все нужные мне времена, НО она также извлекла несколько строк из текстового файла ping, которые мне не нужны. Текстовый файл, который она создала, выглядел так:
--- 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
Если есть возможность избежать извлечения нежелательных строк "---e11699" в "pipe 2" и "86400 packets" в "86532481ms" текстового файла, я был бы очень признателен за помощь!
решение1
Я использовал этот sed:
sed -n 's/.*time=\([0-9].*\)ms.*/\1/p' times | sort -n
В вашем примере файла ( 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
Я получаю такой результат:
sed -n 's/.*time=\([0-9].*\)ms.*/\1/p' times | sort -n
11.7
12.6
17.2
Я использовал -n
переключатель, чтобы избавиться от нежелательных линий. От 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.
решение2
если grep
с pcre
регулярным выражением все в порядке:
$ grep -oP 'time=\K[0-9.]+' ip.txt | sort -n
11.7
12.6
17.2
-o
распечатать только соответствующий шаблон-P
использовать pcre регулярное выражениеtime=\K
положительный ретроспективный анализ, не являющийся частью вывода[0-9.]+
одна или несколько цифр и.
символовsort -n
сортировать по числам
с perl
собой в одиночку:
$ perl -nle 'push(@a,/time=\K([0-9.]+)/g); END{ print foreach sort {$a <=> $b} @a }' ip.txt
11.7
12.6
17.2
- здесь массив заполняется соответствующими шаблонами, а затем в конце выводится численно отсортированный массив
решение3
grep 'time=' pingoutput.txt | awk '{print $8}'