有没有一种方法可以分析数据包间隔,以便每秒输出数个数据包?

时间:2019-09-25 17:28:09

标签: bash traffic

我要分析约54,000个数据包,我正在尝试确定每秒的平均数据包数量(以及给定秒数内的最小和最大数据包数量)

我的输入文件是数据包时间的一列(请参见下面的示例):

0.004

0.015

0.030

0.050

..

..

1999.99

我已经使用awk来确定时间增量,但无法找到一种方法来解析时间块以获得以下输出:

0-1s = 10 packets

1-2s = 15 packets 

2 个答案:

答案 0 :(得分:0)

这是如何使用awk获得所需输出的示例。 假设原始输入文件是sample.txt,首先要做的是对它进行反向排序(排序-nr),然后可以通过awk“ -v”参数向awk提供新排序的文件以及时间变量。在awk中执行测试,在需要时使用“下一个”跳过行,并使用“退出”退出awk脚本。

    #!/bin/bash
    #
    for i in 0 1 2 3
    do
        sort -nr sample.txt |awk -v time=$i 'BEGIN{number=0}''{
                                if($1>=(time+1)){next}
                                else if( $1>=time && $1 <(time+1))
                                        {number+=1}
                                else{
                                printf "[ %d - %d [ : %d records\n",time,time+1,number;exit}
                        }'
    done

这是示例文件:

0.1
0.2
0.8
.
.
0.94
.
.
1.5
1.9
.
3.0
3.6

这是程序的输出:

[ 1 - 2 [ : 5 records 
[ 2 - 3 [ : 8 records 
[ 3 - 4 [ : 2 records

希望这会有所帮助!

答案 1 :(得分:0)

请您尝试以下操作:

使用bash

max=0
while read -r line; do
    i=${line%.*}                    # extract the integer part
    a[$i]=$(( ${a[$i]} + 1 ))       # increment the array element
    (( i > max )) && max=$i         # update the maximum index
done < sample.txt

# report the summary
for (( i=0; i<=max; i++ )); do
    printf "%d-%ds = %d packets\n" "$i" $(( i+1 )) "${a[$i]}"
done

使用AWK

awk '
    {
        i = int($0)
        a[i]++
        if (i > max) max = i
    }
    END {
        for (i=0; i<=max; i++)
            printf("%d-%ds = %d packets\n", i, i+1, a[i])
    }' sample.txt

sample.txt:

0.185
0.274
0.802
1.204
1.375
1.636
1.700
1.774
1.963
2.044
2.112
2.236
2.273
2.642
2.882
3.000
3.141
5.023
5.082

输出:

0-1s = 3 packets
1-2s = 6 packets
2-3s = 6 packets
3-4s = 2 packets
4-5s = 0 packets
5-6s = 2 packets

希望这会有所帮助。