【问题标题】:Bash script to print certain data from a file用于从文件打印某些数据的 Bash 脚本
【发布时间】:2017-04-19 14:48:00
【问题描述】:

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

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,我也不希望脚本显示这一点。

现在,第三个示例,有一个访问者滥用规则并使用来自同一 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

【问题讨论】:

    标签: bash scripting


    【解决方案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
    

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-19
    • 1970-01-01
    • 2017-01-18
    • 2018-09-28
    • 2012-09-28
    • 2022-01-04
    相关资源
    最近更新 更多