Извлечение времени из текстового файла

Итак, я пытаюсь написать сценарий оболочки в 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 пакетов» в «86532481ms» текстового файла, я бы очень признателен за помощь!

0
03.10.2016, 15:11
3 ответа

Я использовал этот sed:

sed -n 's/.*time=\([0-9].*\)ms.*/\1/p' times | sort -n

В вашем примере файла ( раз ):

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 По умолчанию каждая строка ввода отображается в стандартный вывод после применения к нему всех команд. Параметр -n подавляет такое поведение.

0
28.01.2020, 05:06
grep 'time=' pingoutput.txt | awk '{print $8}'
-1
28.01.2020, 05:06

если grep с pcre regex в порядке:

$ grep -oP 'time=\K[0-9.]+' ip.txt | sort -n
11.7
12.6
17.2
  • -o печатать только совпадающий шаблон
  • -P использовать pcre regex
  • time=\K положительный lookbehind, не часть вывода
  • [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
  • здесь массив заполняется совпадающими шаблонами, а затем в конце распечатывается численно отсортированный массив
0
28.01.2020, 05:06

Теги

Похожие вопросы