Bash脚本用于从文件中打印某些数据

时间:2017-04-19 14:48:00

标签: bash scripting

我有这个不断收集网站访问者数据的文件:

IP-ADDR : DATE : BITCOIN-ADDR

我想知道是否有办法找到具有相同IP-ADDR但不同BITCOIN-ADDR的行并打印出来。

例如,在此文件上运行脚本:

11.11.11.11 : 19-04-2017 08:01:33am  : 3N1zXzkjYYNcUSZHD98wcG7UXjNxkCXXXX
22.22.22.22 : 19-04-2017 08:01:35am  : 1HSJDWp5gLybnhowBZcnoYTBBmuJxBXXXX
12.12.12.12 : 19-04-2017 08:02:24am  : 1HSJDWp5gLybnhowBZcnoYTBBmuJxBYYYY

每一行都不同,不打印输出。

此外,在

上运行非常重要
11.11.11.11 : 19-04-2017 08:01:33am  : 3N1zXzkjYYNcUSZHD98wcG7UXjNxkCXXXX
22.22.22.22 : 19-04-2017 08:01:35am  : 1HSJDWp5gLybnhowBZcnoYTBBmuJxBXXXX
22.22.22.22 : 19-04-2017 08:02:24am  : 1HSJDWp5gLybnhowBZcnoYTBBmuJxBXXXX
22.22.22.22 : 19-04-2017 08:01:35am  : 1HSJDWp5gLybnhowBZcnoYTBBmuJxBXXXX
22.22.22.22 : 19-04-2017 08:02:24am  : 1HSJDWp5gLybnhowBZcnoYTBBmuJxBXXXX

不打印任何东西。

但是,

上运行
11.11.11.11 : 19-04-2017 08:01:33am  : 3N1zXzkjYYNcUSZHD98wcG7UXjNxkCXXXX
22.22.22.22 : 19-04-2017 08:01:35am  : 1HSJDWp5gLybnhowBZcnoYTBBmuJxBXXXX
22.22.22.22 : 19-04-2017 08:02:24am  : 1HSJDWp5gLybnhowBZcnoYTBBmuJxBYYYY

将会看到IP 22.22.22.22具有不同的比特币地址并将打印:

1HSJDWp5gLybnhowBZcnoYTBBmuJxBXXXX
1HSJDWp5gLybnhowBZcnoYTBBmuJxBYYYY

我使用过这里曾经帮助过我的代码:

awk -F " : " '{ printf "%s_%s\n" , $1, $3 }' test.txt | sort | sed 's/\(\s*\)\(.*\)\(\s\)/\2/' | uniq | perl -pe 's/(\s*)(.*?)_(.*)/\2/' | uniq -d

如果在最后一个例子中运行,将打印

22.22.22.22

但我无法绕过它以使其适用于比特币地址。

以下是另外三个例子:

1.1.1.1 : 19-04-2017 08:01:33am : aaaaa
2.2.2.2 : 19-04-2017 08:01:33am : bbbbb

3.3.3.3 : 19-04-2017 08:01:33am : ccccc
3.3.3.3 : 19-04-2017 08:01:33am : ccccc

4.4.4.4 : 19-04-2017 08:01:33am : ddddd
4.4.4.4 : 19-04-2017 08:01:33am : eeeee

第一个例子,每个ip和btc都不同,我不介意。

第二个例子,同样的ip但同样的btc,我也不介意,它只是一个诚实的回访者,一遍又一遍地使用相同的btc,我不会&#39 ; t希望脚本显示出来。

现在,第三个例子,有一个访问者滥用规则并使用来自同一个ip addr的不同btc addr。使用我发布的脚本,我可以打印他的IP,并通过另一个脚本,将其添加到iptables防火墙。但是我需要另一个脚本(我在这里请求帮助)给我打印以下输出:

ddddd
eeeee

所以我可以使用另一个脚本并阻止他访问。

请帮忙吗?谢谢!

LE:找到解决方案(感谢@danielbmartin):

awk '{if (index(a[$1],$NF)==0) a[$1]=a[$1]" " $NF}
  END{for (j in a)
  {n=split(a[j],b);
   if (n>1) print j" references "a[j]}}' \
$InFile >$OutFile

1 个答案:

答案 0 :(得分:1)

$ cat ip.txt 
1.1.1.1 : 19-04-2017 08:01:33am : aaaaa
2.2.2.2 : 19-04-2017 08:01:33am : bbbbb

3.3.3.3 : 19-04-2017 08:01:33am : ccccc
3.3.3.3 : 19-04-2017 08:01:33am : ccccc

4.4.4.4 : 19-04-2017 08:01:33am : ddddd
4.4.4.4 : 19-04-2017 08:01:33am : eeeee

$ awk -F: '($1 in a) && a[$1]!=$NF{print $1} {a[$1]=$NF}' ip.txt 
4.4.4.4 
  • -F:使用:作为字段分隔符
  • {a[$1]=$NF}创建一个数组,其中第一列为键,最后一列为值
  • ($1 in a) && a[$1]!=$NF如果第一列已作为键存在但值不匹配
    • print $1打印第一栏


要打印最后一栏

$ awk -F: '($1 in a) && a[$1]!=$NF{print a[$1]"\n"$NF} {a[$1]=$NF}' ip.txt 
 ddddd
 eeeee

注意:此代码不考虑多个不匹配