我有一个包含800万个数据包的pcap文件,我将其缩减为只包含三个字段的txt文件:时间(以秒为单位),IP源地址,类型(流量)。
我需要从这个800万行文件中提取那些包含100个或更多数据包的IP地址,从而消除那些不符合100个数据包或更多标准的地址,从而缩小文件。
但是我需要在减少的txt文件中保留所有3个字段和剩余地址(100+个数据包)流中的所有数据包,因为我需要计算每个IP源地址的数据包流持续时间(结束时间)流量 - 流量的开始时间),并且仅保留流量持续时间为60秒或更长的Ip源地址,从而进一步减少我的文件。
当我使用命令行工具来满足第一个标准(100个或更多数据包)时,我消除了这些地址的所有数据包流。如何使用命令行工具实现这两个条件,以便能够使用bash脚本自动执行该过程? 下面是我需要应用这两个标准的文件示例。非常感谢你的帮助!
1385957611.118522 99.61.34.145 TCP 1385957859.425248 99.61.34.145 TCP 1385958784.632631 99.61.34.145 TCP 1385959038.972602 99.61.34.145 TCP 1385959481.571627 99.61.34.145 TCP 1385860339.225421 37.139.6.111 TCP 1385860339.238402 37.139.6.111 TCP 1385860339.286538 37.139.6.111 TCP 1385860339.379029 37.139.6.111 TCP 1385860339.380669 37.139.6.111 TCP 1385860339.425247 37.139.6.111 TCP 1385860339.556737 37.139.6.111 TCP 1385860339.583913 37.139.6.111 TCP 1385860339.623861 37.139.6.111 TCP 1385857840.419300 103.248.63.253 TCP 1385857841.739372 103.248.63.253 TCP 1385857848.593171 103.248.63.253 TCP 1385857850.411457 103.248.63.253 TCP
答案 0 :(得分:0)
我认为你可以使用awk和xargs的组合来实现这一目标。以下脚本假定您的数据文件被组织为每行一个记录,并且每个时间戳都大于前一个时间戳:
awk '{
line = $0;
addr = $2;
addrcount[addr]++;
}
END {
for (addr in addrcount) {
if (addrcount[addr] >= 100) {
print addr;
}
}
}' [DATA_FILE] | xargs -P [MAXPROCS] -I 'IP_ADDR' awk '{ if ($2 == "IP_ADDR") { print $0 } }' [DATA_FILE] | awk '{
timestamp = $1
addr = $2;
traffictype = $3;
if (!(addr in minfor)) {
minfor[addr] = timestamp;
}
maxfor[addr] = timestamp;
typefor[addr] = traffictype;
}
END {
for (addr in minfor) {
print addr, minfor[addr], maxfor[addr], maxfor[addr] - minfor[addr], typefor[addr]
}
}' | awk '{ if ($4 >= 60) { print $1, $5} }'
第一个awk位指出哪些IP地址有100多条记录并打印出来,每行一个地址。这是通过管道运行xargs运行另一个awk脚本,该脚本仅打印文件中具有这些IP地址的那些行。这可以防止您在尝试过滤100多个数据包时丢失上下文。倒数第二个awk脚本遍历过滤数据中的每一行,并记录最小时间戳和最大时间戳,然后打印出差异。它还记录流量类型。最后的awk脚本过滤数据,只有那些时间增量超过60的IP地址,打印IP地址和流量类型。