从 tshark 中提取前 5 个 TCP 或 UDP 流,按总字节数降序排列

从 tshark 中提取前 5 个 TCP 或 UDP 流,按总字节数降序排列

正如问题标题所述,给定一个数据包捕获,我想提取 TCP(或 UDP)的前 5 个流,并按总字节数降序排序。

到目前为止我已经想到了这一点
tshark -r test.pcap -q -z conv,tcp | sed "1,5d" | head -n -1 | sort -r -k5 | head -n 5

和命令用于删除前 5 行和最后一行,然后对第 5 列进行排序,并再次使用将输出截断为前 5sed行。headhead

tshark 命令输出的示例如下所示(删除了标题行和最后一行):

10.215.173.1:49248         <-> 49.44.185.78:443                84 312 kB         78 10 kB         162 323 kB      215.775760000        12.0809
10.215.173.1:49212         <-> 49.44.185.78:443                83 312 kB         76 10 kB         159 322 kB      215.740042000        12.1151
10.215.173.1:49302         <-> 49.44.185.78:443                79 211 kB         80 9876 bytes     159 221 kB      215.811485000        12.0465
10.215.173.1:49242         <-> 49.44.185.78:443                82 312 kB         76 10 kB         158 322 kB      215.771412000        12.0851
10.215.173.1:49134         <-> 49.44.185.78:443                80 311 kB         76 10 kB         156 322 kB      215.647900000        12.2038
10.215.173.1:49202         <-> 49.44.185.78:443                83 312 kB         73 10 kB         156 322 kB      215.728497000        12.1263
10.215.173.1:49290         <-> 49.44.185.78:443                77 211 kB         78 9700 bytes     155 221 kB      215.803830000        12.0538
10.215.173.1:49278         <-> 49.44.185.78:443                77 211 kB         77 9612 bytes     154 221 kB      215.797622000         7.7149
10.215.173.1:49342         <-> 49.44.185.78:443                74 211 kB         75 9436 bytes     149 220 kB      215.866905000        11.9925
10.215.173.1:49360         <-> 49.44.185.78:443                73 211 kB         74 9348 bytes     147 220 kB      215.895946000        11.9642

按顺序排列的列:Source ip:port Destination ip:port Incoming Packets:Bytes Outgoing Packets:Bytes Total Packets:Bytes Relative start Duration of flow

我想您能看出这里的问题,有些值是 in,kB而其他值只是字节,因为 sort 仅适用于数值,所以结果会是错误的。即使所有值都在,kB似乎sort也会给出错误的输出,这意味着我使用的方式是错误的。

如何将所有相关的bytes列相关值转换为kB,然后以正确的方式对输出进行排序?

任何其他替代方法tshark也是可以接受的。

答案1

完成您所要求的最干净的方法是找到一种方法来tshark打印实际的(机器可读的)数字,以便您可以轻松地sort。不幸的是,tshark似乎在 3.3.0 版本中改变了它们打印这些值的方式(从机器可读到人类可读),并且查看源代码,这似乎不可配置,无论是使用命令行选项,还是使用其中一个首选项。

如果没有这个选项,我能看到的最容易实现的方法是尝试将人类可读的格式转换为人类可以理解的格式sort -h,即数字和之间没有空格,kB也没有单位bytes

像这样的事情应该可以解决问题:

tshark -r test.pcap -q -z conv,tcp |
    sed "1,5d" |
    head -n -1 |
    sed -E -e 's/ ([kMGT]B )/\1/g' |
    sed -e 's/ bytes /     /g' |
    sort -h -r -k5 |
    head -n 5

但同样,最佳解决方案是如果有人要更新tshark并添加一个选项,使这些值的呈现可配置(人机可读)。这种格式被称为人机可读是有原因的,并且不需要由机器解析。

答案2

看了评论和答案后,我认为最好解析输出tshark并使用某种编程语言来推断所需的结果。
我认为使用带有包的python比使用linux CLI工具pandas更能让我轻松简单地完成这项任务。 我知道这不是预期的方法,但可以节省时间并更轻松。sedsort

相关内容