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

Bash 是否有一种方法可以分析数据包间隔,以便每秒输出#个数据包?,bash,traffic,Bash,Traffic,我有大约54000个数据包要分析,我试图确定每秒数据包的平均数(以及给定秒内数据包的最小值和最大值) 我的输入文件是一列数据包时间(见下面的示例): 我使用awk来确定时间增量,但无法找到解析时间块以获得以下输出的方法: 0-1s = 10 packets 1-2s = 15 packets etc以下是如何使用awk获得所需输出的示例。 假设您的原始输入文件是sample.txt,首先要做的是对其进行反向排序(sort-nr),然后您可以通过awk“-v”参数为awk提供新排序的文件以及

我有大约54000个数据包要分析,我试图确定每秒数据包的平均数(以及给定秒内数据包的最小值和最大值)

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

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

0-1s = 10 packets

1-2s = 15 packets 

etc

以下是如何使用awk获得所需输出的示例。 假设您的原始输入文件是sample.txt,首先要做的是对其进行反向排序(sort-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
以下是程序的输出:

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

希望这有帮助

请尝试以下方法:

使用
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
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

希望这能有所帮助。

我得到的唯一问题是0-1的实例数是123,但之后脚本会为每个间隔输出123。。。即1-2s=123、2-3s=123等(不准确)。我使用了下面的脚本:#/bin/bash max=0,而read-r line do i=${line%.*}a[$i]=$(${a[$i]}+1))((i>max))&&max=$i done“${a[$1]}”,该代码写为
“${a[$i]}”
在我的回答中。这就是为什么相同的数字重复出现的原因。你是如何复制和粘贴我的代码的?啊,是的。我很抱歉。我只是个盲人。我从主机到虚拟机的复制和粘贴出现问题,所以我不得不手动将其卡住。谢谢你的帮助!有没有办法修改它,使其在不同的迭代次数中运行?比如“for i in Hi Mark!您应该注意,for循环应该一直运行,直到达到最大时间值,而不是行数。如果您按照我在回答中的建议对示例文件进行反向排序,最大时间值应该位于文件的顶部,您可以通过以下方式获得:max_time_integer=$(cat sample.txt | sort-nr | head-1 | awk'{print int($1)+1} “)之后,使用while或for循环:for i in
seq 0$max_time_integer
do.doneAh,随时间从0循环到$max_time_integer。非常感谢您的解释。我对bash还是很陌生。@MarkP让我注意,上面的方法可能适合计算指定(有限)中的#数据包周期范围,如果您希望在整个周期内分析结果,则由于循环中存在grep,因此执行时间将不高效。假设您的输入文件在2000秒的观察时间内有54000行,它将在54000行以上重复2000次grep。这可能值得您尝试,仅供将来参考:)@没错,您的方法在执行时间上更加高效,特别是因为文件已经排序。
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
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