Извлечение миллисекунд из traceroute с Bash для последующей обработки данных (с Python) - PullRequest
0 голосов
/ 04 февраля 2020

Я хочу извлечь все миллисекундные значения для прыжков, которые генерирует traceroute в Linux (версия 2.0.21). Ожидаемый вывод, который я хочу получить, выглядит следующим образом:

xx
xx
xx
xx

, где xx обозначает миллисекунды для каждого перехода в выполнении traceroute , без пробелов до или после. Для справки, пример чистого traceroute вывода:

2  100.66.0.254 (100.66.0.254)  13.592 ms 100.66.0.208 (100.66.0.208)  15.711 ms 100.66.0.216 (100.66.0.216)  21.187 ms
3  100.66.0.21 (100.66.0.21)  21.266 ms 100.66.0.31 (100.66.0.31)  21.223 ms 100.66.0.29 (100.66.0.29)  21.183 ms

Я пытался решить этот код, который не работает для всех выходных данных traceroute.

(вход)

traceroute adomain.com | awk '!/traceroute/ {print $4;'}

Поле $4 не всегда является значением в миллисекундах, в зависимости от характеристик скачка. См. Ниже:

(Вывод)

33.252
24.905
23.776
25.157
(xxx.xxx.xxx.xxx)
(xxx.xxx.xxx.xxx)
*
*

(xxx используется для искажения рассматриваемого IP).

Итак, выше вы можете видеть это для последних четырех записи Я не получаю значения в миллисекундах.

Есть ли для этого решение awk или sed?

PS Я публикую это в StackOverflow, потому что эта задача является частью сбора данных. задача, и данные будут использоваться в более широком контексте программирования.

1 Ответ

1 голос
/ 04 февраля 2020

РЕДАКТИРОВАТЬ: Добавление решения в случае, если кто-то хочет получить несколько миллисекунд в одной строке тоже на выходе, то можно попробовать следующее.

awk '
{
  while(match($0,/[0-9]+\.[0-9]+ ms/)){
    print substr($0,RSTART+3,RLENGTH-6)
    $0=substr($0,RSTART+RLENGTH)
  }
}
' Input_file


Поскольку вы не показали точный пример вывода, поэтому эта команда предоставляется только на основе ваших пояснений.

traceroute adomain.com |\
awk 'match($0,/[0-9]+\.[0-9]+ ms/){print substr($0,RSTART+3,RLENGTH-6)}'

Объяснение: Добавление подробное объяснение вышеуказанного кода.

awk '                                    ##Starting awk program from here.
match($0,/[0-9]+\.[0-9]+ ms/){           ##Using match with regex to match digits DOT digits space ms in a line.
  print substr($0,RSTART+3,RLENGTH-6)    ##If a match if found then RSTART, RLENGTH variables are SET(which are default awk variables).
                                         ##Then I am printing sub-string which starts from RSTART+3 till value of RLENGTH-3
}
'  Input_file                            ##Mentioning Input_file name here.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...