簡體   English   中英

Bash腳本從文件中打印某些數據

[英]Bash script to print certain data from a file

我有一個不斷收集網站訪問者數據的文件:

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地址不同的btc地址。 使用我發布的腳本,我可以打印他的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
$ 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

注意:此代碼不考慮多個不匹配項

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM