在该文件中,security.log
我需要查找有多少 IP 地址具有最高的 DNSBL 5 排名。该文件中的一行如下所示:
Oct 24 00:00:28 MAIL-00 postfix/postscreen[10909]: dnsbl rank 5 for [103.129.47.51]:50807
为了用 DNSBL 排名过滤掉 IP 地址,我做了:
grep "ip" security.log | grep -i "DNSBL" security.log
或者我可以写一个 shell 脚本来提供帮助,我在想这样的事情:
#!/bin/bash
#grep every ip with "dnsbl rank 5"
#count the amount of times each unique one appears, create variable with IP and value is the number of times it appears
#Find the variable with the biggest value and output the variable name to screen
该脚本需要删除其他内容,因此要搜索的输出只是之前具有“dnsbl ran 5”的 IP 列表。我已经cut
很长时间没有使用过,这是只获取括号内的 IP 的最佳方法吗?
如果有人可以帮助我,我将非常感激!
答案1
如果这些行始终与您显示的行相似,您可以执行以下操作:
sed -nE 's/.*dnsbl rank 5.*\[([0-9\.]+)\].*/\1/pi' test.log | sort | uniq -c | sort -nr | head -n 1
sed 命令仅打印包含“dnsblrank 5”的行,但删除除该短语后面一对括号中的内容之外的所有内容,然后第一个排序命令将所有匹配项放在一起,uniq 命令计算每个匹配项的匹配数ip,第二次排序将它们按顺序排列,而 head 命令取前 1。
输出应该类似于:
4 103.129.47.51
如果 dnsbl 排名 5 的 IP 地址出现了四次,并且比其他任何一个都多。
然而,这并不能真正解释关系,并且数据的格式必须一致。
答案2
awk '/dnsbl rank 5/{for(i=1;i<=NF;i++){if ($i ~ /[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}/){gsub(/\].*/,"",$i);gsub(/\[/,"",$i);print $i}}}' filename| awk '{a[$1]++}END{for(x in a){print x,a[x]}}'| sort -k2 -nr
这可能有帮助