如何在一个文件中搜索 3 个特定的内容?

如何在一个文件中搜索 3 个特定的内容?

在该文件中,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

这可能有帮助

相关内容