如何从/var/log/auth.log中提取当日的唯一IP地址并生成排序后的列表?
如何从/var/log/auth.log中提取当日的唯一IP地址并生成排序后的列表?
我来给你几个实用的方案,完美解决你提取当日攻击IP的需求,先说说你之前命令行不通的原因:你用冒号:作为awk的分隔符,但日志里的字段是用空格分隔的,所以$14根本定位不到IP,自然出不来正确结果。
下面是几个靠谱的方法:
方法一:自动匹配当日日期,提取唯一IP并排序
这个方法不用手动输入日期,会自动获取系统当天的日期格式,和日志里的格式对齐:
today=$(date +'%b %e') grep "$today" /var/log/auth.log | grep 'rhost=' | awk '{sub(/.*rhost=/,"",$0); print $1}' | sort -n | uniq
方法二:统计每个IP的攻击次数(按次数降序)
如果想知道哪个IP攻击最频繁、优先处理,可以用这个命令,会显示每个IP的攻击次数并从多到少排序:
today=$(date +'%b %e') grep "$today" /var/log/auth.log | grep 'rhost=' | awk '{sub(/.*rhost=/,"",$0); print $1}' | sort -n | uniq -c | sort -nr
方法三:简化管道,用awk一步过滤日期和IP
如果觉得管道太多,也可以用awk直接完成日期过滤和IP提取,效率更高一点:
today=$(date +'%b %e') awk "/$today/ && /rhost=/ {sub(/.*rhost=/,"",\$0); print \$1}" /var/log/auth.log | sort -n | uniq
各部分命令的作用解释:
today=$(date +'%b %e'):自动获取当前系统的月份缩写(比如Jun)和日期(个位数日期前面会带空格,和日志格式完全匹配)grep "$today" /var/log/auth.log:筛选出当天的所有日志条目grep 'rhost=':只保留包含远程IP标记rhost=的认证失败记录awk '{sub(/.*rhost=/,"",$0); print $1}':把每行中rhost=之前的内容全部清空,剩下的第一个字段就是我们要的IP地址sort -n:对IP地址进行数字排序,让同段的IP排在一起,看起来更清晰uniq:去除重复的IP,只保留唯一条目;uniq -c会统计每个IP出现的次数,后面加sort -nr就是按次数从高到低排序
这样你就能轻松得到当日所有攻击来源的唯一IP列表,甚至能知道哪个IP攻击最凶,方便你针对性处理~
备注:内容来源于stack exchange,提问作者j0h
相关产品推荐
相关产品推荐

