Ответы в этой теме дали мне ключи к решению аналогичной проблемы со статистикой 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 основных частей.
- tshark создает отчет с данными в столбцах
- Извлеките нужные строки с помощью grep
- Используйте 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