Выходной файл CSV с использованием командной строки для статистики графика ввода-вывода Wireshark

Я сохраняю статистику графика ввода-вывода в виде CSV-файла, содержащего биты в секунду, используя графический интерфейс wireshark. Есть ли способ сгенерировать этот файл CSV с помощью командной строки tshark? Я могу генерировать статистику в командной строке в байтах в секунду следующим образом

tshark -nr test.pcap -q -z io, stat, 1, БАЙТЫ

Как мне генерировать биты в секунду и сохранять их в файл CSV?

Любая помощь приветствуется.


person gfernandes    schedule 19.06.2018    source источник


Ответы (3)


Я не знаю, как это сделать, используя только tshark, но вы можете легко проанализировать вывод tshark в файл CSV:

tshark -nr tmp.pcap -q -z io,stat,1,BYTES | grep -P "\d+\s+<>\s+\d+\s*\|\s+\d+" | awk -F '[ |]+' '{print $2","($5*8)}'

Пояснения

  • grep -P "\d+\s+<>\s+\d+\s*\|\s+\d+" выбирает только необработанные данные из вывода tshark с фактическими данными (т. е. second <> second | transmitted bytes).
  • awk -F '[ |]+' '{print $2","($5*8)}' разбивает эти данные на 5 блоков с [ |]+ в качестве разделителя и отображает блоки 2 (второй, с которого начинается интервал) и 5 ​​(передаваемые байты) с запятой между ними.
person pchaigno    schedule 19.06.2018
comment
Благодарю за ваш ответ. Я анализировал вывод с помощью скрипта Python. Я просто хотел знать, возможно ли это только с помощью tshark. - person gfernandes; 19.06.2018
comment
Согласно документации нельзя. Я проверял только с Wireshark 2.2.6. - person pchaigno; 19.06.2018
comment
хорошо, тогда приму это как ответ. Спасибо вам за помощь. - person gfernandes; 19.06.2018

Еще одна вещь, которую, возможно, полезно знать:

Если вы измените интервал с 1 секунды на 0,5 секунды, вы должны разрешить . в части grep, добавив \. между двумя цифрами \d .

В противном случае результатом будет пустой файл *.csv.

grep -P "\d{1,2}\.{1}\d{1,2}\s+<>\s+\d{1,2}\.{1}\d{1,2}\s*\|\s+\d+"
person jjulianf    schedule 01.08.2018

Ответы в этой теме дали мне ключи к решению аналогичной проблемы со статистикой tshark io, и я хотел поделиться результатами и тем, как это работает. В моем случае задача состояла в том, чтобы преобразовать несколько столбцов статистических записей tshark io с потенциальными десятичными знаками в данных. Этот ответ преобразует несколько столбцов данных в csv, добавляет элементарные заголовки, учитывает десятичные знаки в полях и переменное количество пробелов.

Полная командная строка

tshark -r capture.pcapng -q -z io,stat,30,,FRAMES,BYTES,"FRAMES()ip.src == 10.10.10.10","BYTES()ip.src == 10.10.10.10","FRAMES()ip.dst == 10.10.10.10","BYTES()ip.dst == 10.10.10.10" \
| grep -P "\d+\.?\d*\s+<>\s+|Interval +\|" \
| tr -d " " | tr "|" "," | sed -E 's/<>/,/; s/(^,|,$)//g; s/Interval/Start,Stop/g' > somefile.csv

Объяснение

Командная строка состоит из 3 основных частей.

  1. tshark создает отчет с данными в столбцах
  2. Извлеките нужные строки с помощью grep
  3. Используйте tr и sed, чтобы преобразовать записи, совпадающие с grep, в файл с разделителями csv.

Часть 1: tshark создает отчет с данными в столбцах

tshark запускается с -z io,stat с интервалом в 30 секунд, подсчитывая кадры и байты с различными фильтрами.

tshark -r capture.pcapng -q -z io,stat,30,,FRAMES,BYTES,"FRAMES()ip.src == 10.10.10.10","BYTES()ip.src == 10.10.10.10","FRAMES()ip.dst == 10.10.10.10","BYTES()ip.dst == 10.10.10.10"

Вот результат работы с моим тестовым файлом pcap:

=================================================================================================
| IO Statistics                                                                                 |
|                                                                                               |
| Duration: 179.179180 secs                                                                     |
| Interval:  30 secs                                                                            |
|                                                                                               |
| Col 1: Frames and bytes                                                                       |
|     2: FRAMES                                                                                 |
|     3: BYTES                                                                                  |
|     4: FRAMES()ip.src == 10.10.10.10                                                          |
|     5: BYTES()ip.src == 10.10.10.10                                                           |
|     6: FRAMES()ip.dst == 10.10.10.10                                                          |
|     7: BYTES()ip.dst == 10.10.10.10                                                           |
|-----------------------------------------------------------------------------------------------|
|            |1                   |2       |3          |4       |5         |6       |7          |
| Interval   | Frames |   Bytes   | FRAMES |   BYTES   | FRAMES |   BYTES  | FRAMES |   BYTES   |
|-----------------------------------------------------------------------------------------------|
|   0 <>  30 | 107813 | 120111352 | 107813 | 120111352 |  26682 | 15294257 |  80994 | 104808983 |
|  30 <>  60 | 122437 | 124508575 | 122437 | 124508575 |  49331 | 17080888 |  73017 | 107422509 |
|  60 <>  90 | 138999 | 135488315 | 138999 | 135488315 |  54829 | 22130920 |  84029 | 113348686 |
|  90 <> 120 | 158241 | 217781653 | 158241 | 217781653 |  42103 | 15870237 | 115971 | 201901201 |
| 120 <> 150 | 111708 | 131890800 | 111708 | 131890800 |  43709 | 18800647 |  67871 | 113082296 |
| 150 <> Dur | 123736 | 142639416 | 123736 | 142639416 |  50754 | 22053280 |  72786 | 120574520 |
=================================================================================================

Соображения

Глядя на этот вывод, мы видим несколько вещей, которые следует учитывать:

  • Строки с данными имеют уникальную последовательность в столбце Interval пробела, которую мы можем использовать для сопоставления.
  • Нам нужна строка заголовка, поэтому мы будем использовать слово Interval, за которым следуют пробелы, а затем символ | символ.
  • Количество пробелов в столбце зависит от количества цифр в измерении.
  • В столбце «Интервал» указано время от 0 и от первого измерения. Можно использовать любой из них, поэтому мы сохраним оба и позволим пользователю решить.
  • При использовании миллисекунд в поле «Интервал» будут десятичные дроби.
  • В зависимости от запрашиваемой статистики в столбцах данных могут быть десятичные дроби.
  • Использование | поскольку разделители потребуют экранирования в любом операторе регулярного выражения, который их охватывает.

Часть 2: Извлеките нужные строки с помощью grep

Как только tshark производит вывод, мы используем grep с регулярным выражением для извлечения строк, которые хотим сохранить.

grep -P "\d+\.?\d*\s+<>\s+|Interval +\|""

grep будет использовать последовательность символов Digit(s)Space(s)‹›Space(s) в столбце Interval для сопоставления строк с данными. Он также использует оператор ИЛИ для захвата заголовка путем сопоставления символов Interval |.

grep -P         # The "-P" flag turns on PCRE regex matching, which is not the same as egrep. With egrep, you will need to change the escaping.
 "\d+            # Match on 1 or more Digits. This is the 1st set of numbers in the Interval column.
 \.?             # 0 or 1 Periods. We need this to handle possible fractional seconds.
 \d*             # 0 or more Digits. To handle possible fractional seconds.
 \s+<>\s+        # 1 or more Spaces followed by the Characters "<>", then 1 or more Spaces.
 |               # Since this is not escaped, it is a regex OR
 Interval\s+\|"  # Match the String "Interval" followed by 1 or more Spaces and a literal "|".

Из вывода tshark grep сопоставил следующие строки:

| Interval   | Frames |   Bytes   | FRAMES |   BYTES   | FRAMES |   BYTES  | FRAMES |   BYTES   |
|   0 <>  30 | 107813 | 120111352 | 107813 | 120111352 |  26682 | 15294257 |  80994 | 104808983 |
|  30 <>  60 | 122437 | 124508575 | 122437 | 124508575 |  49331 | 17080888 |  73017 | 107422509 |
|  60 <>  90 | 138999 | 135488315 | 138999 | 135488315 |  54829 | 22130920 |  84029 | 113348686 |
|  90 <> 120 | 158241 | 217781653 | 158241 | 217781653 |  42103 | 15870237 | 115971 | 201901201 |
| 120 <> 150 | 111708 | 131890800 | 111708 | 131890800 |  43709 | 18800647 |  67871 | 113082296 |
| 150 <> Dur | 123736 | 142639416 | 123736 | 142639416 |  50754 | 22053280 |  72786 | 120574520 |

Часть 3. Используйте tr и sed для преобразования записей, совпавших с grep, в файл csv с разделителями.

tr и sed используются для преобразования строк, совпадающих с grep, в csv. tr выполняет основную работу по удалению пробелов и изменению | к ,. Это проще и быстрее, чем использовать sed. Однако sed используется для некоторых работ по очистке.

tr -d " " | tr "|" "," | sed -E 's/<>/,/; s/(^,|,$)//g; s/Interval/Start,Stop/g'

Вот как эти команды выполняют преобразование. Первая хитрость состоит в том, чтобы избавиться от всех пробелов. Это означает, что нам не нужно учитывать их в каких-либо последовательностях регулярных выражений, что упрощает остальную работу.

| tr -d " "                 # Spaces are in the way, so delete them.
| tr "|" ","                # Change all "|" Characters to ",".
| sed -E 's/<>/,/;          # Change "<>" to "," splitting the Interval column.
  s/(^,|,$)//g;               # Delete leading and/or trailing "," on each line.
  s/Interval/Start,Stop/g'    # Each of the "Interval" columns needs a header, so change the text "Interval" into two words with a , separating them.
> somefile.csv              # Pipe the output into somefile.csv

Конечный результат

После завершения этого процесса у нас есть вывод csv, который теперь можно импортировать в ваш любимый инструмент csv, электронную таблицу или передать в графическую программу, такую ​​​​как gnuplot.

$cat somefile.csv
Start,Stop,Frames,Bytes,FRAMES,BYTES,FRAMES,BYTES,FRAMES,BYTES
0,30,107813,120111352,107813,120111352,26682,15294257,80994,104808983
30,60,122437,124508575,122437,124508575,49331,17080888,73017,107422509
60,90,138999,135488315,138999,135488315,54829,22130920,84029,113348686
90,120,158241,217781653,158241,217781653,42103,15870237,115971,201901201
120,150,111708,131890800,111708,131890800,43709,18800647,67871,113082296
150,Dur,123736,142639416,123736,142639416,50754,22053280,72786,120574520
person Kevin    schedule 18.03.2021