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