[英]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.