我有一个包含登录数据的日志文件,我需要生成一个报告,汇总所有失败的登录尝试并由用户组织。该文件中的一行如下所示:
Jan 21 19:22:23 localhost sshd[1234]: Failed password for USER from 127.0.0.1 port 12345 ssh2 #IPs and such obscured, obviously
它是我需要计算和总结的USER
行。该模式始终为Failed password for USER
,因此有帮助,但由于线路上其他垃圾的数量,我无法执行awk -F
或其他字符串拆分。
如何计算每个失败的登录信息并按用户计算总数?
答案 0 :(得分:1)
使用GNU grep,试试这个:
grep -Po "Failed password for \K.*?(?= from)" logfile.log | sort | uniq -c
-P
启用perl正则表达式,允许使用\K
之类的内容
-o
仅打印匹配的部分,而不是包含匹配的整行
\K
使grep忘记之前匹配的部分,以便它不会出现在输出中
.*?
与USER匹配。只打印此部分
(?= from)
是确定USER何时结束所需的先行者。
grep
部分为USER的每次失败登录尝试打印USER。现在我们只需要计算每个用户的出现次数。这是通过习语sort | uniq -c
完成的。
最终输出如下:
7 adam
2 bob
14 claire
输出按用户名排序。要按失败尝试次数排序,请将| sort -nr
附加到命令。
答案 1 :(得分:0)
关注awk
可能对您有帮助。
awk '/Failed password for/{gsub(/.*for | from.*/,"");a[$0]++} END{for(i in a){print i,a[i]}}' Input_file
现在也添加非单线形式的解决方案。
awk '
/Failed password for/{
gsub(/.*for | from.*/,"");
a[$0]++
}
END{
for(i in a){
print i,a[i]}
}
' Input_file
答案 2 :(得分:0)
这是一个perl解决方案:
perl -nle '$seen{$1}++ if /Failed password for (\S+) from /; END { print "$_: $seen{$_}" for sort keys %seen }'
这个想法是使用正则表达式从匹配的行中提取用户名,使用它来在哈希中构建直方图(将用户名映射到计数),并在最后打印出来。