如何使用shell/bash按组计算IP对

如何使用shell/bash按组计算IP对,bash,grouping,Bash,Grouping,我需要将下面列表中的一对IP分组,以获得总数 在列表中,第一列是从IP-1到IP2的跟踪数据包总数。我希望在每次巧合后打印另一个流程 这是我需要的输出,如下所示: 2 66.165.180.244 > 166.210.225.9 3 166.210.225.9 > 66.165.180.244 7 69.20.10.25 > 166.210.225.9 79 166.210.225.9 > 69.20.10.25 ... 这是我的列表,按第一个IP排序,然后按第二

我需要将下面列表中的一对IP分组,以获得总数

在列表中,第一列是从IP-1到IP2的跟踪数据包总数。我希望在每次巧合后打印另一个流程

这是我需要的输出,如下所示:

2 66.165.180.244 > 166.210.225.9

3 166.210.225.9 > 66.165.180.244

7 69.20.10.25 > 166.210.225.9

79 166.210.225.9 > 69.20.10.25
...
这是我的列表,按第一个IP排序,然后按第二个IP排序:

 2 66.165.180.244 > 166.210.225.9

   7 69.20.10.25 > 166.210.225.9

  54 72.4.126.205 > 166.210.225.9

  11 93.183.19.220 > 198.228.90.150

 441 93.183.9.188 > 198.228.90.150

  ....

  41 166.210.225.9 > 212.142.237.4

  26 166.210.225.9 > 216.177.212.222

   3 166.210.225.9 > 66.165.180.244

  79 166.210.225.9 > 69.20.10.25

  66 166.210.225.9 > 72.4.126.205

   7 166.210.64.120 > 181.52.246.116

   1 166.210.67.221 > 200.74.148.220

   1 166.210.67.230 > 200.74.148.220

   3 166.210.67.252 > 200.74.148.220

 .....

我感谢您的帮助,有一个方法来获得这一订单的IP对集。我试着通过分类来获得答案,但不知道如何将这些对组合在一起。我使用bash。

如果我正确理解了您的问题,您可以通过以下方式获得所需的输出:

  • 假设您的输入存储在
    input.dat
  • >
    替换为空格,以便统一列分隔符
  • 以IP1-IP2的形式添加一个额外的列,其中IP1和IP2分别是两个IP地址的字典最小值和最大值
  • 根据此辅助列进行排序(也根据IP1和IP2)
  • 过滤此排序输出并仅保留最后一列中重复的记录,即与一对IP地址相对应的记录
  • 最后,去掉辅助列
换句话说:


tr'>'''也许有人可以帮助改进脚本。要获得请求的输出,请执行以下操作:

2 66.165.180.244 > 166.210.225.9
3 166.210.225.9 > 66.165.180.244

7 69.20.10.25 > 166.210.225.9
79 166.210.225.9 > 69.20.10.25

我创建了下面的脚本,它可以工作,但不是最优的,因为需要一些延迟来处理:

#!/bin/sh

row=`wc -l traffic.txt | awk '{print $1'}`
i=1
echo -e "#Pkts\tIP1\t\t\tIP2"
echo -e "-----\t----------\t\t----------"
while [ $i -le $row ]; do
    PKTS=`cat traffic.txt | awk '{print $1}' | head -$i | tail -1`
    IP1=`cat traffic.txt | awk '{print $2}' | head -$i | tail -1`
    IP2=`cat traffic.txt | awk '{print $4}' | head -$i | tail -1`
    echo -e "$PKTS\t$IP1\t>\t$IP2"
    a=1
    while [ $a -le $row ]; do
        BUSCPKTS=`cat traffic.txt | awk '{print $1}' | head -$a | tail -1`
        BUSCIP1=`cat traffic.txt | awk '{print $2}'  | head -$a | tail -1`
        BUSCIP2=`cat traffic.txt | awk '{print $4}' | head -$a | tail -1`
            if [ "$BUSCIP1" = "$IP2" ];
         then
            if [ "$BUSCIP2" = "$IP1" ] ;
                then
                        echo -e "$BUSCPKTS\t$BUSCIP1\t>\t$BUSCIP2"
            fi
            fi
            a=`expr $a + 1`
    done
    i=`expr $i + 1`
    echo
done
也许用AWK可以跑得更好,但我没有这么多的经验。无法在计算机中使用GAWK


谢谢。

您的输入是四列,您试图按第二列和第四列排序?
#!/bin/sh

row=`wc -l traffic.txt | awk '{print $1'}`
i=1
echo -e "#Pkts\tIP1\t\t\tIP2"
echo -e "-----\t----------\t\t----------"
while [ $i -le $row ]; do
    PKTS=`cat traffic.txt | awk '{print $1}' | head -$i | tail -1`
    IP1=`cat traffic.txt | awk '{print $2}' | head -$i | tail -1`
    IP2=`cat traffic.txt | awk '{print $4}' | head -$i | tail -1`
    echo -e "$PKTS\t$IP1\t>\t$IP2"
    a=1
    while [ $a -le $row ]; do
        BUSCPKTS=`cat traffic.txt | awk '{print $1}' | head -$a | tail -1`
        BUSCIP1=`cat traffic.txt | awk '{print $2}'  | head -$a | tail -1`
        BUSCIP2=`cat traffic.txt | awk '{print $4}' | head -$a | tail -1`
            if [ "$BUSCIP1" = "$IP2" ];
         then
            if [ "$BUSCIP2" = "$IP1" ] ;
                then
                        echo -e "$BUSCPKTS\t$BUSCIP1\t>\t$BUSCIP2"
            fi
            fi
            a=`expr $a + 1`
    done
    i=`expr $i + 1`
    echo
done