Я написал несколько сценариев оболочки, которые запускают маршруты трассировки на хосты, а затем сохраняет их в файл. Это отлично работает и выводит все данные в файл .log
, как и предполагалось.Traceroute log to CSV Perl parser Regex issue
У меня тогда был написан простой скрипт Perl, который превращает этот .log
в файл .csv
, поэтому я могу импортировать его в excel. Однако, глядя на файл .csv
, созданный скрипт Perl, который я написал, имеет проблемы при работе с пакетами, у которых есть IP-адреса со временем.
Например, эта строка из файла .log
разбирается отлично:
1 139.222.0.1 0.941 ms 1.446 ms 1.996 ms
в файл .csv
как:
1,139.222.0.1,0.941 ms,1.446 ms,1.996 ms
Однако, если трассировку вернуть что-либо подобное этому который хранится в файле .log
:
12 154.54.57.98 7.579 ms 154.54.74.42 7.009 ms 130.117.0.58 7.480 ms
Затем он обрабатывается в .csv
файл некорректно и губит весь следующий .csv
файл (это составило пример):
11,213.248.77.134,7.432 ms,9.038 ms,213.248.70.238 ms
Как вы можете видеть IP заданный с время перехвата теперь используется как время, необходимое для пакета.
Я очень смущен, как исправить это! Любая помощь будет оценена, вот фрагмент кода, который превращает журнал в формате CSV для каждого прыжка:
my $start = "'Hop','IP','T1','T2','T3'";
print OUTPUT "\n$_$start\n";
};
print OUTPUT "$1,$2,$3 ms,$4 ms,$5 ms\n" if (/(\d+)\s+(\S+)\s+(\S+)\s+ms\s+(\S+)\s+ms\s+(\S+)/);
EDIT
написал свой собственный исправление, добавляет дополнительные столбцы CSV и вкладыши в них соответствующим образом
my $start = "'Hop','IP','T1','T1IP','T2','T2IP',T3'";
print OUTPUT "\n$_$start\n";
};
if (/(\d+)\s+(\S+)\s+(\S+)\s+ms\s+(\S+)\s+ms\s+(\S+)\s+ms/){
print OUTPUT "$1,$2,$3 ms, ,$4 ms, ,$5 ms\n";
}elsif (/(\d+)\s+(\S+)\s+(\S+)\s+ms\s+(\S+)\s+(\S+)\s+ms\s+(\S+)\s+ms/){
print OUTPUT "$1,$2,$3 ms,$4,$5 ms, ,$6 ms\n";
}elsif (/(\d+)\s+(\S+)\s+(\S+)\s+ms\s+(\S+)\s+ms\s+(\S+)\s+(\S+)\s+ms/){
print OUTPUT "$1,$2,$3 ms, ,$4 ms,$5,$6 ms\n";
}elsif (/(\d+)\s+(\S+)\s+(\S+)\s+ms\s+(\S+)\s+(\S+)\s+ms\s+(\S+)\s+(\S+)\s+ms/){
print OUTPUT "$1,$2,$3 ms,$4,$5 ms,$6,$7 ms\n";
};
Спасибо за вашу помощь/ответы!
Пожалуйста, покажите код, который не работает – Borodin
код, который работает Isnt print OUTPUT "$ 1, $ 2, $ 3 ms, $ 4 ms, $ 5 ms \ n" if (/ (\ d +) \ s + (\ S +) \ s + (\ S +) \ s + ms \ s + (\ S +) \ S + мс \ S + (\ S +) /); как эта учетная запись только в том случае, если traceroute возвращает только значения времени, а не время и значения IP –